題目描述:鏈表反轉
輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。
題目解析:
牛客解題,很完美!
題目所給的是單鏈表,想了一下反轉後的樣子:最後一個結點指向倒數第二個,倒數第二個指向倒數第三個,…,第二個指向第一個,第一個指向null;
知道了反轉後各個結點指向哪之後,就需要開始調整每個結點的next指針。
這就需要把結點挨個從鏈表上摘下來,做調整;
這個調整過程需要兩個指針輔助:pre記錄其前一個結點位置,好讓該結點的next指針指向前一個結點,但是在指向前一個結點前需要用一個指針p記錄後一個結點地址,避免結點丟失。
例子:
以head結點爲例步驟如下:
1.反轉後head是指向null,所以未反轉的時候其前一個結點應該是null,初始化pre指針爲null;
2.用p指針記錄head的下一個結點head.next;
3.從鏈表上摘下head,即讓head.next指向pre;
4.此時已完成head結點的摘取及與前一個節點的連接,則我們需要操作下一個結點:故需移動pre和head,讓pre指向head,head指向下一個節點。
重複這四個操作直到head走完原鏈表,指向null時,循環結束,返回pre。
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function ReverseList(pHead)
{
//初始化pre指針,用於記錄當前結點的前一個結點地址
var pre = null;
//初始化p指針,用於記錄當前結點的下一個結點地址
var p = null;
//pHead指向null時,循環終止。
while(pHead != null){
//先用p指針記錄當前結點的下一個結點地址。
p = pHead.next;
//讓被當前結點與鏈表斷開並指向前一個結點pre
pHead.next = pre;
//pre指針指向當前結點
pre = pHead;
//head指向p(保存着原鏈表中head的下一個結點地址)
pHead = p;
}
return pre;
}