題目:
反轉(zhuǎn)一個(gè)單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進(jìn)階:
你可以迭代或遞歸地反轉(zhuǎn)鏈表橄碾。你能否用兩種方法解決這道題滔韵?
題目分析:
參考的別人的际看,感覺(jué)很醍醐奶油灌頂喔(重要的是思想嘛)
用幾張圖來(lái)解釋?xiě)?yīng)該更加清晰,假設(shè)現(xiàn)在有一個(gè)鏈表是下圖這樣的盖高。
然后我們聲明3個(gè)指針慎陵,一個(gè)指向當(dāng)前節(jié)點(diǎn), 一個(gè)指向當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)喻奥,還有一個(gè)指向當(dāng)前節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)席纽。
重點(diǎn)看 while
循環(huán)中的內(nèi)容:第一次循環(huán)后鏈表變成了這樣,注意節(jié)點(diǎn)1指向了pre(也就是NULL)撞蚕,此時(shí)1和2斷開(kāi)了润梯。(下面都用圈表示指針,虛線處說(shuō)明斷鏈了)
沒(méi)看明白甥厦?那再來(lái)一次纺铭,第二次循環(huán)過(guò)程中,current -> next = pre;
這句話讓節(jié)點(diǎn)2指向了節(jié)點(diǎn)1刀疙,這時(shí)候2和3就斷開(kāi)了舶赔。
然后執(zhí)行 pre = current;
和 current = next;
這兩句話將pre指針前移到節(jié)點(diǎn)2,current指針前移到節(jié)點(diǎn)3谦秧,所以第二次循環(huán)完成后鏈表是這樣的竟纳。
如此循環(huán)下去,將鏈表指針一個(gè)一個(gè)指向前一個(gè)數(shù)疚鲤,從而實(shí)現(xiàn)了鏈表反轉(zhuǎn)的功能锥累。
注意:到最后一個(gè)數(shù)的時(shí)候,current和pre之間還是斷開(kāi)的集歇,從上面的圖也能看出來(lái)揩悄,每次循環(huán)完會(huì)有斷鏈。所以最后用 current -> next = pre;
將鏈連起來(lái)鬼悠。
C++代碼如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* current = head;
ListNode* pre = NULL;
ListNode* next = NULL;
if (head == NULL) return head;
while (current -> next) {
next = current -> next;
current -> next = pre;
pre = current;
current = next;
}
current -> next = pre;
return current;
}
};