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

题目:输入一个链表的头节点,从尾到头打印出每一个节点的值。(要求不改变链表的结构)

链表节点定义如下:

1 struct ListNode
2 {
3     int nKey;
4     ListNode *pNext;
5 }

思路一:由从尾到头容易想到栈的后进先出的性质,于是可以用栈实现。(如果可以改变链表的结构,则可以先把链表反转,再从头依次输出结果)

反转链表可参考:http://www.cnblogs.com/ivorfeng/archive/2013/05/02/3055471.html

 code:

 1 //利用栈实现
 2 void PrintListInStack(ListNode *pHead)
 3 {
 4     ListNode *pCur = pHead;
 5     std::stack<ListNode*> stackA;
 6 
 7     while(pCur != NULL)
 8     {
 9         stackA.push(pCur);
10         pCur = pCur->pNext;
11     }
12 
13     while(!stackA.empty())
14     {
15         ListNode *pNode = stackA.top();
16         stackA.pop();
17         printf("%d ",pNode->nKey);
18     }
19 }

 

思路二:上面用到栈的性质,而递归的本质就是使用栈的,于是可以利用递归来实现。

code:

 1 //递归
 2 void PrintListRecurively(ListNode *pHead)
 3 {
 4     
 5     if(pHead != NULL)
 6     {
 7         PrintListRecurively(pHead->pNext);
 8         printf("%d ", pHead->nKey);
 9     }
10 }

下面是main函数和一些建立函数:

 1 //建立链表
 2 void buildList(ListNode *& pHead)
 3 {
 4     int tmp;
 5     ListNode *pPre= NULL;
 6     printf("建立链表,以0表示终止:\n");
 7     while(scanf("%d", &tmp) && tmp != 0)
 8     {
 9         ListNode *p = new ListNode();
10         p->nKey = tmp;
11         p->pNext = NULL;
12         if(pHead == NULL)
13         {
14             pHead = p;
15             pPre = pHead;
16         }
17         else
18         {
19             pPre->pNext = p;
20             pPre = pPre->pNext;
21         }
22     }
23 }
24 //顺序输出链表
25 void PrintListInOrder(ListNode *pHead)
26 {
27     ListNode *pCur = pHead;
28     printf("链表顺序输出:\n");
29     while(pCur!= NULL)
30     {
31         printf("%d ",pCur->nKey);
32         pCur = pCur->pNext;
33     }
34     printf("\n");
35 }
36 
37 int main()
38 {
39     ListNode *pHead = NULL;
40     buildList(pHead);
41     PrintListInOrder(pHead);
42     printf("链表逆序输出:\n");
43     PrintListRecurively(pHead);
44     return 0;
45 }

 example:

转载于:https://www.cnblogs.com/ivorfeng/archive/2013/05/02/3055378.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值