剑指Offer - 九度1511 - 从尾到头打印链表
2013-11-29 21:08
- 题目描述:
-
输入一个链表,从尾到头打印链表每个节点的值。
- 输入:
-
每个输入文件仅包含一组测试样例。
每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。
- 输出:
-
对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。
- 样例输入:
-
1 2 3 4 5 -1
- 样例输出:
-
5 4 3 2 1
题意分析:
给定一条单链表,从未到头打印出来。第一个念头是可以用头递归的写法进行倒序输出,但不论头递归还是尾递归都不是个会写代码的人该写出来的,因为递归调用中的栈操作开销太累,而且百万级的数据就能搞出栈溢出了。所以可以采取先反转链表,再输出的方法。至于输出完了要不要再转回去,就看数据还有没有人要用了。不过从原则上来说,既然要求设计的是逆序输出链表,就不应该改变原始数据,应该在处理完了以后把链表给转回来的。本题中的数据时一次性的,我索性输出完了就给释放掉了。
时间复杂度O(n),空间复杂度O(1)。
1 // 650320 zhuli19901106 1511 Accepted 点击此处查看所有case的执行结果 5088KB 731B 90MS 2 // 201311122057 3 #include <cstdio> 4 #include <vector> 5 using namespace std; 6 7 class ListNode{ 8 public: 9 int val; 10 ListNode *next; 11 ListNode(int _val = 0) : val(_val), next(NULL){} 12 }; 13 14 int main() 15 { 16 ListNode *root; 17 ListNode *tail; 18 int n; 19 vector<ListNode *> vv; 20 21 root = new ListNode(); 22 tail = root; 23 vv.clear(); 24 while(scanf("%d", &n) == 1 && n >= 0){ 25 tail->next = new ListNode(n); 26 tail = tail->next; 27 vv.push_back(tail); 28 } 29 30 while(vv.size() > 0){ 31 printf("%d ", vv[vv.size() - 1]->val); 32 vv.pop_back(); 33 } 34 35 tail = root; 36 while(tail != NULL){ 37 root = tail->next; 38 delete tail; 39 tail = root; 40 } 41 42 return 0; 43 }