【剑指offer】2.从尾到头打印链表

总目录:

算法之旅导航目录

 

1. 题目内容
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:

返回一个数组为[3,2,1]
PS:0 <= 链表长度 <= 10000

 

 

2. 解题思路
翻转问题,
1考虑栈,因为它的先进后出特性;
2考虑递归,因为它在返回前才执行一些逻辑,其实底层实现也是栈。

 

 

3. cpp代码

使用栈

 1 /**
 2 *  struct ListNode {
 3 *        int val;
 4 *        struct ListNode *next;
 5 *        ListNode(int x) :
 6 *              val(x), next(NULL) {
 7 *        }
 8 *  };
 9 */
10 class Solution {
11   public:
12     vector<int> printListFromTailToHead(ListNode* head) {
13         stack<int> s;
14         vector<int> ret;
15 
16         while (head != NULL) {
17             s.push(head->val);
18             head = head->next;
19         }
20 
21         while (!s.empty()) {
22             ret.push_back(s.top());
23             s.pop();
24         }
25 
26         return ret;
27     }
28 };
View Code

 

使用递归

 1 /**
 2 *  struct ListNode {
 3 *        int val;
 4 *        struct ListNode *next;
 5 *        ListNode(int x) :
 6 *              val(x), next(NULL) {
 7 *        }
 8 *  };
 9 */
10 class Solution {
11   public:
12     void recurve(ListNode* cur, vector<int>& vec) {
13         if (cur == NULL) {
14             return;
15         }
16 
17         //继续深入递归
18         recurve(cur->next, vec);
19 
20         //存储当前值
21         vec.push_back(cur->val);
22     }
23 
24     vector<int> printListFromTailToHead(ListNode* head) {
25         //创建返回值
26         vector<int> ret;
27 
28         //开始递归
29         recurve(head,ret);
30 
31         return ret;
32     }
33 };
View Code

 

posted @ 2022-11-09 09:25  啊原来是这样呀  阅读(88)  评论(0)    收藏  举报