鏈表的反轉問題,包含很多種類型,有整體反轉,兩兩交換、區間反轉(m-n)、按照K個反轉等,這些反轉問題的共性都是我們要找到實際反轉的區間,區間又分爲兩種情況:
1、包含兩端節點,比如兩兩交換,此時區間爲 【head,tail】閉區間。
2、不包含最大邊界,比如反轉鏈表,此時區間爲【head,null)左閉右開。
模板代碼:
1、區間反轉-閉區間
public ListNode rev(ListNode head, ListNode tail) {
if (head == null || head == tail) {
return head;
}
ListNode cur = rev(head.next, tail);
head.next.next = head;
head.next = null;
return cur;
}
2、區間反轉-左閉又開
public ListNode rev(ListNode head, ListNode tail) {
if (head == null || head.next == tail) {
return head;
}
ListNode cur = rev(head.next, tail);
head.next.next = head;
head.next = null;
return cur;
}
實際應用
1、反轉鏈表--直接調用模板二即可
2、兩兩交換--可以先遍歷鏈表找到每次開始和結束的節點調用模板一(也可以使用一次遞歸完成)
3、按照K個數進行反轉,可以先遍歷找到前K個節點,調用模板二完成反轉
4、從M-N可以先找到M和N節點調用模板一,然後在和M之前與N之後連接形成新的鏈表
鏈表注意事項
1、一定檢查null,防止空指針,
2、一定要防止環形出現,節點被多次使用,一定要備份
3、斷開不必要指針