92.反轉連結串列Ⅱ(連結串列內指定區間反轉)
阿新 • • 發佈:2021-12-16
目錄
92.反轉連結串列Ⅱ(連結串列內指定區間反轉)
題目
給你單鏈表的頭指標 head 和兩個整數left 和 right ,其中left <= right 。請你反轉從位置 left 到位置 right 的連結串列節點,返回 反轉後的連結串列 。
示例 1:
輸入:head = [1,2,3,4,5], left = 2, right = 4
輸出:[1,4,3,2,5]
示例 2:
輸入:head = [5], left = 1, right = 1
輸出:[5]
提示:
連結串列中節點數目為 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
進階: 你可以使用一趟掃描完成反轉嗎?
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/reverse-linked-list-ii
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題解
一個連結串列分為三部分 不需要反轉1 需要反轉的 不需要反轉2
這裡就需要在反轉前,記錄下需要反轉部分的前一個節點和需要反轉的部分後一個節點,防止反轉後連線不上。
1.找到需要反轉的前一個節點
2.開始反轉left-right的節點,邊遍歷邊反轉,可以參考206.反轉連結串列
3.連線節點
ListNode dummy = new ListNode(0); dummy.next = head; ListNode pre = dummy; //防止從頭開始反轉,最後pre尾空的情況 int count = right-left+1; if(right == left) return dummy.next; //找到需要反轉的部分 while(--left!=0){ pre = head; head=head.next; } ListNode next= head; //開始反轉固定位置 ListNode tmp ; ListNode preNode=null; int count = right-left+1; while(count-- != 0){ tmp = next.next; next.next =preNode; preNode = next; next = tmp; } //連線連結串列 pre.next = preNode; head.next = next; return dummy.next;