題目描述:
· 輸入一個(gè)鏈表捶闸,從尾到頭打印鏈表每個(gè)節(jié)點(diǎn)的值夜畴。
解題思路:
思路1:
第一反應(yīng)是將鏈表中的指針?lè)崔D(zhuǎn),改變鏈表的方向删壮,然后再?gòu)念^打印出來(lái)(該方法改變了原來(lái)鏈表的結(jié)構(gòu)贪绘,這就要看面試或筆試時(shí)的要求,可否改變鏈表結(jié)構(gòu))
思路2:
遍歷鏈表時(shí)是從頭到尾央碟,而打印鏈表時(shí)卻是從尾到頭税灌,典型的“先進(jìn)后出”——棧的特點(diǎn),從而可以用棧來(lái)實(shí)現(xiàn)亿虽。每遍歷一個(gè)節(jié)點(diǎn)菱涤,把該節(jié)點(diǎn)放到一個(gè)棧中,當(dāng)遍歷完整個(gè)鏈表后洛勉,再?gòu)臈m旈_(kāi)始逐個(gè)輸出節(jié)點(diǎn)的值粘秆,此時(shí)輸出的節(jié)點(diǎn)順序已經(jīng)反轉(zhuǎn)過(guò)來(lái)了。
思路3:
検蘸粒可以實(shí)現(xiàn)攻走,而遞歸本質(zhì)上也是一個(gè)棧結(jié)構(gòu),從而可以用遞歸來(lái)實(shí)現(xiàn)此再。即:沒(méi)遍歷到一個(gè)節(jié)點(diǎn)時(shí)陋气,先遞歸輸出其后面的一個(gè)節(jié)點(diǎn)的值,再輸出該節(jié)點(diǎn)本身的值引润。
代碼實(shí)現(xiàn)
思路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;
}
};