从尾到头打印链表
- 题目描述:
-
输入一个链表,从尾到头打印链表每个节点的值。
每个输入文件仅包含一组测试样例。
每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。
-
根据链表的特性,查找其中某一个结点的时间复杂度是O(n)。
遍历链表的时候,将遍历的结果存放在一个栈中,遍历结束以后输出栈中的元素值即可。
1 /* 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <stack> 5 #include <algorithm> 6 using namespace std; 7 */ 8 struct listnode 9 { 10 int data; 11 node* next; 12 }; 13 14 void add(listnode** phead,int value) 15 { 16 /*链表是一种动态结构,创建时无需知道大小,每插入一个节点都要为新节点开辟空间,调整指针指向没有闲置的内存,链表的空间效率比数组高。*/ 17 listnode* p=new listnode(); 18 p->data=value; 19 p->next=null; 20 //判断链表是否为空 21 if( null == *phead ) 22 { 23 *phead=p; 24 } 25 else 26 { 27 listnode* find=*phead; 28 //遍历找到插入的位置 29 while(find->next!=null) 30 { 31 find=find->next; 32 } 33 find-next=p; 34 } 35 } 36 int printlist(listnode* phead) 37 { 38 stack<int> s; 39 listnode* p=*phead; 40 while(null!=p) 41 { 42 s.push(p->data); 43 p=p->next; 44 } 45 printf("从尾到头打印链表:\n"); 46 while(!s.empty()) 47 { 48 printf("%d\n",s.top()); 49 s.pop(); 50 } 51 } 52