面試題16:定義一個函數,輸入一個鏈表的頭結點,反轉該鏈表並輸出反轉後鏈表的頭結點。面試
三指針向前推動法(自創詞彙方便記憶)bash
因爲反向鏈表每一個節點時,須要切斷鏈表,此時就須要切口先後兩個Node holder: pre 和 next
能夠想象成一根繩子切成兩段,分別須要兩我的來牽住繩頭
左邊繩子須要牽住右端(逆序)
右邊繩子只需有人保住後面那段鏈表便可,所以右邊繩子牽住左端。
若是不找這兩我的來牽住各自兩邊的繩頭,切斷後的兩段鏈表就會丟失,只要沒有Holder,就被回收
同時須要從前日後遍歷下去,須要多一個移動指針 Node cur 收割者,從頭結點head開始收割
複製代碼
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null) {
return null;
}
if(head.next == null) {
return head;
}
ListNode pre = null;
ListNode next = null;
ListNode cur = head;
while(cur != null) {
next = cur.next;//一、讓 next 小哥提早握住即將要切斷的右邊繩子的繩頭
cur.next = pre;//二、把 cur 以後的繩子切斷,cur 的牽住的人從next哥換成pre妹子,此時完成左邊繩子的逆序
pre = cur;//三、善後:爲了下一步繼續遍歷下去,須要讓 pre 往前右走一步,cur 把他握住的節點移交給pre妹子
cur = next;//四、善後:左邊繩子的逆序徹底執行完畢,cur 小哥往右走一步,和 next 一塊兒牽住右段繩子的繩頭
//此時 cur 收割者又準備收割下一個節點了!
}
return pre;//注意,pre 就至關於左邊逆序好的鏈表頭了
}
}
複製代碼