题解 | #链表内指定区间反转#

链表内指定区间反转

https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
 *
 * @param head ListNode类
 * @param m int整型
 * @param n int整型
 * @return ListNode类
 */
function reverseBetween(head, m, n) {
    const virtualHead = new ListNode(0);
    virtualHead.next = head;

    let pre = virtualHead,
        cur = null;

    // pre 前面不动的结点区域
    // 题目的结点顺序下标是从1开始的,这里需要移动到不动结点的最后一个位置,也就是m的前一个位置
    for (let i = 1; i < m; i++) {
        pre = pre.next;
    }

    // 开始需要反转的结点
    cur = pre.next;
   
    // 需要反转的循环次数
    for(let i = 0; i < n - m; i++) {
        // 利用一个临时变量完成两个结点的反转
        const temp = cur.next;
        // 当前结点指向下下个结点(跳过临时结点)
        cur.next = cur.next.next;
        
        // temp的下一个结点是前面不动结点的下一个结点(注意这里并不是cur)
        temp.next = pre.next;

        // 前面不动的区域的下一个结点是当前这个临时结点 
        pre.next = temp;

        // 经过上面的交换就完成了结点顺连,并且cur还完成了下移
    }

    return virtualHead.next;
}
module.exports = {
    reverseBetween: reverseBetween,
};

下面给出图解:

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务