題目描述
輸入一個鏈表,從尾到頭打印鏈表每個節點的值。
棧實現
要解決這個問題,肯定要遍歷鏈表,從頭到尾遍歷鏈表,從尾到頭輸出值,典型的“后進先出”,自然可以想到用棧來解決。
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> vals;
stack<ListNode*> nodes;
ListNode* pNode=head;
while(pNode!=NULL){
nodes.push(pNode);
pNode=pNode->next;
}
while(!nodes.empty()){
pNode=nodes.top();
vals.push_back(pNode->val);
nodes.pop();
}
return vals;
}
};
遞歸實現
遞歸本質上是一個棧結構,要實現反過來輸出鏈表,可以每訪問到一個節點的時候,先遞歸輸出它后面的節點,再輸出節點本身。
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> vals;
PrintListReversing(head,vals);
return vals;
}
void PrintListReversing(ListNode *pNode, vector<int> &vals){
if(pNode!=NULL){
if(pNode->next!=NULL)
PrintListReversing(pNode->next,vals);
vals.push_back(pNode->val);
}
}
};