92. Reverse Linked List II

Leetcode

https://leetcode.com/problems/reverse-linked-list-ii/

題目

Given the head of a singly linked list and two integers left and right where left <= right, reverse the nodes of the list from position left to position right, and return the reversed list.

Example 1:

Input: head = [1,2,3,4,5], left = 2, right = 4
Output: [1,4,3,2,5]

Example 2:

Input: head = [5], left = 1, right = 1
Output: [5]

解答

  • 方法一

把整個 linked list 分成三部分進行處理,[正常排序] - [逆排序] - [正常排序]

For example:

head = [1, 2, 3, 4, 5],left = 2,right = 4

最終答案是 1 -> 4 -> 3 -> 2 -> 5 ,我們主要要做的就是把中間的 2, 3, 4 逆排序過來

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;
};

Runtime: 68 ms, faster than 89.41% of JavaScript online submissions for Reverse Linked List II.

Memory Usage: 38.9 MB, less than 78.24% of JavaScript online submissions for Reverse Linked List II.

測資

head = [1,2,3,4,5], left = 2, right = 4

output = [1,4,3,2,5];

Last updated

Was this helpful?