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

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

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

看到這個題目,有兩個想法:一是先反轉連結串列,再從頭到尾列印節點,但這樣會修改原連結串列的結構。

而是從頭到尾列印連結串列,放入輸出vector中,再反轉vector。

#include<cstdlib>
#include<vector>
#include<iterator>
#include<stack>
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> rev;
        stack<int> stk; 
        ListNode* node = head;
        int temp;
        while(node != NULL)
        {
            stk.push(node->val);
            node = node->next;
        }
        while(!stk.empty())
        {
            temp = stk.top();
            rev.push_back(temp);
            stk.pop();
        }        
        return rev;
    }
};

調錯總結:

由於對STL容器的使用方法不是很熟悉,出現了很多錯誤。

(1)pop與top:pop()彈出棧頂元素並不返回棧頂元素,top()返回棧頂元素,不會刪除棧頂元素。

所以這裡報錯:把void型別賦給int型別有誤。

(2)怎麼往vector中新增元素呢?開始 rev[pos] = temp,報錯,應該是陣列越界了,都沒有rev第i個元素都不存在,怎麼引用它給它複製呢。查看了vector的insert宣告,兩個引數,第一個引數iterator型別,表示插入的位置,第二個是插入的值。通過了,後面才此知道有個push_back()方法直接往vector後面新增元素啊。

。。。。。。。

遞迴的方法


#include<cstdlib>
#include<vector>
#include<iterator>
#include<stack>
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> rev;
        if(head != NULL)
        {
            if(head->next != NULL)
            {
                printListFromTailToHead(head->next);
            }
            rev.push_back(head->val);
        }
        return rev;
    }
};
報錯,應該是在遞迴函式裡放return不合適,如果傳入vector的引用就好了,這樣就可以在裡面修改vector,而返回值為void,原問題是列印節點沒有返回值所以可行。