1. 程式人生 > 其它 >92.反轉連結串列Ⅱ(連結串列內指定區間反轉)

92.反轉連結串列Ⅱ(連結串列內指定區間反轉)

目錄

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;