剑指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\n", 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 }
 
 posted on 2013-11-29 21:17  zhuli19901106  阅读(308)  评论(0编辑  收藏  举报