剑指Offer - 九度1511 - 从尾到头打印链表

剑指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 }
 

你可能感兴趣的:(链表)