劍指offer 06. 從尾到頭列印連結串列
阿新 • • 發佈:2018-12-09
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; } };