題目描述:
· 輸入一個鏈表,從尾到頭打印鏈表每個節點的值。
解題思路:
思路1:
第一反應是將鏈表中的指針反轉,改變鏈表的方向,然后再從頭打印出來(該方法改變了原來鏈表的結構,這就要看面試或筆試時的要求,可否改變鏈表結構)
思路2:
遍歷鏈表時是從頭到尾,而打印鏈表時卻是從尾到頭,典型的“先進后出”——棧的特點,從而可以用棧來實現。每遍歷一個節點,把該節點放到一個棧中,當遍歷完整個鏈表后,再從棧頂開始逐個輸出節點的值,此時輸出的節點順序已經反轉過來了。
思路3:
棧可以實現,而遞歸本質上也是一個棧結構,從而可以用遞歸來實現。即:沒遍歷到一個節點時,先遞歸輸出其后面的一個節點的值,再輸出該節點本身的值。
代碼實現
思路1:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
ListNode *pNext, *pTemp;
vector<int> res;
//邊界檢查
if (head == nullptr)
return res;
//處理頭指針
pNext = head->next;
pTemp = head;
head->next = nullptr;
//單鏈表逆序
while (pNext != nullptr){
pTemp = pNext;
pNext = pNext->next;
pTemp->next = head;
head = pTemp;
}
//逆序打印
while (head != nullptr){
res.push_back(head->val);
head = head->next;
}
return res;
}
};