一、題目描述
1.1 題目
-
反轉鏈表 II
-
反轉從位置 m 到 n 的鏈表。請使用一趟掃描完成反轉。
-
說明:
1 ≤ m ≤ n ≤ 鏈表長度。 -
示例:
輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL
1.2 知識點
- 鏈表
1.3 題目鏈接
二、解題思路
2.1 解題思路
- 找到需要翻轉鏈表頭結點的前置節點;
- 利用頭插法將需要翻轉的節點轉移到另一個鏈表上;
- 最後再將另一個鏈表上的節點恢復到原鏈表即可;
三、實現代碼
3.1 代碼實現
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null || head.next == null) return head;
ListNode dummyHead1 = new ListNode(0);
ListNode dummyHead2 = new ListNode(0);
dummyHead1.next = head;
ListNode ptr = dummyHead1;
// 尋找前置節點
int cnt = m;
while(--cnt > 0) ptr = ptr.next;
// 拆分鏈表
int k = n - m + 1;
while(k-- > 0){
ListNode node = ptr.next;
ptr.next = node.next;
node.next = dummyHead2.next;
dummyHead2.next = node;
}
// 插入節點
while(dummyHead2.next != null){
ListNode node = dummyHead2.next;
dummyHead2.next = node.next;
node.next = ptr.next;
ptr.next = node;
ptr = ptr.next;
}
return dummyHead1.next;
}
}