剑指offer 从尾到头打印链表

题目描述

输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
 
思路1:反转链表,然后遍历输出。(缺点:改变了链表)
思路2:符合先进后出,后进先出(栈)的思想,即先遍历的链表元素后输出,可以用栈来保存先遍历到的元素。
思路3:递归做法,本质上也是栈结构。(如果链表太长,容易导致栈溢出。)
 
思路2:
 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         std::stack<ListNode*> st;
14         vector<int> v;
15         ListNode *temp = head;
16         while (temp != nullptr) {
17             st.push(temp);
18             temp = temp->next;
19         }
20         while (! st.empty()) {
21             int tmp = st.top()->val;
22             v.push_back(tmp);
23             st.pop();
24         }
25         return v;
26     } 
27 };

思路3:

 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         vector<int> v;
14         traverse(head, v);
15         return v;
16     }
17 private:
18     void traverse(ListNode *head, vector<int> &v) {
19         if (head != nullptr) {
20             if (head->next != nullptr) {
21                 traverse(head->next, v);
22             }
23             v.push_back(head->val);
24         }
25     }
26 };

 

posted @ 2019-07-19 11:18  琴影  阅读(215)  评论(0编辑  收藏  举报