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

/*
 * 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) {
    // write code here
    if (!head || m === n) {
        return head; // 如果链表为空或 m === n,直接返回原链表
    }

    // 创建一个虚拟头节点,简化边界条件处理
    let dummy = new ListNode(0);
    dummy.next = head;
    let prev = dummy;

    // 找到第 m-1 个节点,即反转区间的前一个节点
    for (let i = 1; i < m; i++) {
        prev = prev.next;
    }

    // 开始反转区间 [m, n]
    let curr = prev.next; // curr 指向第 m 个节点
    let temp = null;
    let reversePrev = null; // 用于反转区间内的链表

    for (let i = m; i <= n; i++) {
        temp = curr.next; // 保存下一个节点
        curr.next = reversePrev; // 反转当前节点的指针
        reversePrev = curr; // 移动 reversePrev
        curr = temp; // 移动 curr
    }

    // 将反转后的区间连接到原链表
    prev.next.next = curr; // 第 m 个节点(反转后的最后一个节点)连接到第 n+1 个节点
    prev.next = reversePrev; // 第 m-1 个节点连接到反转后的第一个节点

    return dummy.next; // 返回新链表的头节点
}
module.exports = {
    reverseBetween: reverseBetween,
};

全部评论

相关推荐

专业码bug百年:整个宇宙为你而闪烁
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务