1. 程式人生 > >劍指offer 06. 從尾到頭列印連結串列

劍指offer 06. 從尾到頭列印連結串列

1.問題描述

輸入一個連結串列的頭結點,按連結串列值從尾到頭的順序返回一個ArrayList。

2. 解決思路

由於是反向列印,所以是一個“後進先出”的問題,使用來解決,雖然遞迴的本質就是一個棧結構,但是當連結串列非常長的時候,函式呼叫的層級很深,可能會導致函式呼叫棧溢位,魯棒性不夠好。

3. 程式碼實現

1)基於棧的程式碼實現如下:

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> vec;
        stack<int> stack;
        ListNode* node = head;
        //利用棧的後進先出
        if(head != NULL){
            stack.push(head->val);
            while(node->next != NULL){
                node = node->next;
                stack.push(node->val);                               
            }
            while(!stack.empty()){
                vec.push_back(stack.top());
                stack.pop();
            }
        }
        return vec;
        
    }
};

2)基於遞迴的實現程式碼:會超時

class Solution {
public:
    vector<int> vec;
    vector<int> printListFromTailToHead(ListNode* head) {
        ListNode *node = head;
        if(node != NULL){
            while(node->next != NULL){
                printListFromTailToHead(node->next);
            }
            vec.push_back(node->val);
        }
        return vec;
        
    }
};