92.反转链表2

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} left
 * @param {number} right
 * @return {ListNode}
 */
var reverseBetween = function (head, left, right) {
    // 分成三部分,前面部分,中间反转部分,后面部分
    // 找出left到right的节点进行反转,再和前后两段拼接

    if (left >= right) {
        return head
    }

    let cur = head
    let count = 1
    let leftNode
    let rightNode
    let prePartTail = null
    let nextPartHead = null
    while (cur) {
        if (count === left - 1) {
            prePartTail = cur
        }
        if (count === left) {
            leftNode = cur
        }
        if (count === right) {
            rightNode = cur
        }
        if (count === right + 1) {
            nextPartHead = cur
        }
        cur = cur.next
        count++
    }

    function reverse(head) {
        let tail = null
        let cur = head
        let pre = tail
        while (cur) {
            let next = cur.next
            cur.next = pre
            pre = cur
            cur = next
        }
        return pre
    }

    rightNode.next = null // 切断连接
    let midPartHead = reverse(leftNode)
    let midPartTail = midPartHead
    while (midPartTail.next) {
        midPartTail = midPartTail.next
    }

    let resHead
    if (prePartTail) {
        prePartTail.next = midPartHead
        resHead = head
    } else {
        resHead = midPartHead // 说明从head开始就要反转
    }

    midPartTail.next = nextPartHead

    return resHead
};