【劍指Offer】從尾到頭列印連結串列(C++,棧/遞迴)
阿新 • • 發佈:2019-02-12
題目連結
題目描述
輸入一個連結串列,從尾到頭列印連結串列每個節點的值。
思路:從尾到頭列印,符合後進先出,用棧儲存,然後存入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;
}
};
注意:遞迴版的&加比不加要稍快些。雖然遞迴程式碼簡潔,當遞迴呼叫層數很深時,可能會導致函式呼叫棧溢位。