算法学习记录(九十二)

101 阅读1分钟

92. 反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

image.png 解:

  1. 双指针cur1,cur2,分别移动到left对应的节点和right对应的节点。
  2. 两个变量leftPre,rightNext,分别指向left的前一个节点和right的后一个节点。用来将需要反转的链表部分脱离原链表。
  3. 脱离完毕后,反转left到right部分的链表
  4. 再将leftPre,rightNext重新连接到反转后的链表上
  5. 返回链表头部
var reverseBetween = function(head, left, right) {
    const ol = left
    const reverse = (node) => {
        let cur = node 
        let pre = null 
        while (cur) {
            const temp = cur.next 
            cur.next = pre 
            pre = cur 
            cur = temp
        }
        return { rhead: pre, rtail: node }
    }
    let cur1 = head
    let cur2 = head
    let leftPre = null 
    let rightNext = head.next
    while (--left) {
        leftPre = cur1
        cur1 = cur1.next
    }
    while (--right) {
        cur2 = cur2.next
        rightNext = cur2.next
    }
    // 当left是第一个节点的时候就没有上一个节点
    if (leftPre) leftPre.next = null
    cur2.next = null
    const { rhead , rtail } = reverse(cur1)
    if (leftPre) leftPre.next = rhead
    rtail.next = rightNext
    // 当left是1的时候返回反转链表的头节点,否则返回原链表的头节点
    return ol === 1 ? rhead : head
};