92. Reverse Linked List II
Leetcode
題目
Input: head = [1,2,3,4,5], left = 2, right = 4
Output: [1,4,3,2,5]Input: head = [5], left = 1, right = 1
Output: [5]解答
測資
Last updated
Input: head = [1,2,3,4,5], left = 2, right = 4
Output: [1,4,3,2,5]Input: head = [5], left = 1, right = 1
Output: [5]Last updated
var reverseBetween = function(head, left, right) {
if(head === null) return null;
let prev = null;
let curr = head;
// 處理左半邊的正常排序
while(left > 1) {
prev = curr;
curr = curr.next;
left--;
right--;
}
// connect 紀錄左邊正常排序的連接點,example 中為 1
const connect = prev;
// tail 紀錄逆排序完後,應該在逆排序中最右邊的那個點,example 中為 2
let tail = curr;
// 利用 next 來保存 curr.next 的值,最後將 curr 移動到下一個元素
// 不然 curr.next 會在 curr.next = prev 賦值時被指向到 prev 所覆蓋,導致無窮迴圈
let next = null;
// 將中間的排序整個倒轉過來 (變成 4 -> 3 -> 2)
while(right > 0) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
right--;
}
// example 中,逆排序完之後,prev 等於 4、curr 等於 5
// 如果 connect 存在,connect 指向為逆排序中最右邊的值,example 中即 1 -> 4
if(connect !== null) {
connect.next = prev;
} else {
// 如果 connect 不存在,即代表一開始的就是要進行逆排序
// 所以 head 就會是逆排序中最右邊的元素
head = prev;
}
// example 中即代表 tail: 2 -> curr: 5
tail.next = curr;
return head;
};head = [1,2,3,4,5], left = 2, right = 4
output = [1,4,3,2,5];