(Java)單鏈表的反轉
阿新 • • 發佈:2020-12-29
Java_單鏈表的反轉
迭代(雙指標)
cur : 當前節點, 初始化為 head(頭節點) / 第一個節點
pre : 當前節點的前一個節點 , 初始化為null
temp : 當前節點的下一個節點
反轉開始:
一:
//暫存下一個節點,並將當前結點指向前一個節點
ListNode temp = cur.next;
cur.next = pre;
二:
//訪問下一個節點
pre = cur;
cur = temp;
重複此過程,直到cur節點為null 停止
上述步驟就是將 1指向null , 2指向1 .... 直到當前結點為null,反轉完成
//完整程式碼
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
遞迴
遞迴需要滿足的條件 1.一個問題的解可以分解為幾個子問題的解 2.這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣 3.存在遞迴終止條件 (例如:上課時你想知道自己是第幾排, 你只需要問你的前一排是第幾排, 然後你的前一排繼續往前問,直到問到第一排) 所以遞迴:找到終止條件,關注子問題的解決就行,不建議糾結遞迴的過程,容易繞暈,過程其實都是一樣的
單鏈表的反轉,其實就是兩個節點的反轉
private ListNode reverse(ListNode cur, ListNode pre) {
//終止條件
if (cur == null){
return pre;
}
// 遞迴後繼節點
ListNode res = reverse(cur.next, cur);
//反轉,當前結點指向前繼節點
cur.next = pre;
//返回反轉連結串列的頭節點
return res;
}
完整程式碼
public ListNode reverseList(ListNode head) {
return reverse(head,null);
}
public ListNode reverse(ListNode cur,ListNode pre){
if(cur==null){
return pre;
}
ListNode node = reverse(cur.next,cur);
cur.next = pre;
return node;
}