1. 程式人生 > >【劍指Offer】從尾到頭列印連結串列(C++,棧/遞迴)

【劍指Offer】從尾到頭列印連結串列(C++,棧/遞迴)

題目連結
題目描述
輸入一個連結串列,從尾到頭列印連結串列每個節點的值。

思路:從尾到頭列印,符合後進先出,用棧儲存,然後存入vector.O(n)

另外,遞迴本質也是棧結構,所以也可以用遞迴寫。
程式碼【棧】:

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector
<int>
printListFromTailToHead(ListNode* head) { vector<int>res; stack<ListNode*>node; ListNode* pNode=head; while(pNode!=nullptr) { node.push(pNode); pNode=pNode->next; } while(!node.empty()) { pNode=node.top(); node.pop(); res.push_back(pNode->val); } return
res; } };

程式碼【遞迴】:

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int>res;
    vector<int>& printListFromTailToHead(ListNode* head) {
        if
(head!=nullptr) { if(head->next!=nullptr) { printListFromTailToHead(head->next); } res.push_back(head->val); } return res; } };

注意:遞迴版的&加比不加要稍快些。雖然遞迴程式碼簡潔,當遞迴呼叫層數很深時,可能會導致函式呼叫棧溢位。