Day1-leetcode-92-反转链表Ⅱ

86 阅读1分钟

image.png

leetcode原题

解题方法一

1.将链表分成三部分 左、需要反转的部分、右 2.记录四个节点 待反转转头节点、待反转头节点的前一个节点、待反转尾节点、待反转尾节点的后一个节点 3.反转需要反转的部分 4.拼接 左 + 反转后的需要反转的部分 + 右

var reverseBetween = function(head, left, right) {
   if (left === right) return head
   // 虚拟头节点
   const vNode = new ListNode(-1)
   vNode.next = head

   // 反转头节点的前一个节点
   let prev = vNode
   for (let i = 0; i < left - 1; i++) {
       prev = prev.next
   }

    // 反转尾节点
    let rightNode = prev
    for (let i = 0; i < right - left + 1; i++) {
        rightNode = rightNode.next
    }
    
    // 反转头节点 
    let leftNode = prev.next
    // 反转尾节点的后一个节点
    let curr = rightNode.next

    prev.next = null
    rightNode.next = null

    // 反转
    reverse(leftNode)
    
    // 拼接
    prev.next = rightNode
    leftNode.next = curr
    
    return vNode.next
};

// 这里跟 206-反转链表相同
var reverse = function(head) {
    let prev = null
    curr = head

    while(curr) {
        const next = curr.next
        curr.next = prev
        prev = curr
        curr = next
    }
}