劍指offer——從尾到頭列印連結串列
阿新 • • 發佈:2019-02-02
輸入一個連結串列,按連結串列值從尾到頭的順序返回一個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後面新增元素啊。
。。。。。。。
遞迴的方法
報錯,應該是在遞迴函式裡放return不合適,如果傳入vector的引用就好了,這樣就可以在裡面修改vector,而返回值為void,原問題是列印節點沒有返回值所以可行。#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; } };