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

链表内指定区间反转

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) {
    // write code here
    // 当你在链表的头部放入一个哨兵,然后连上head节点。之后就把head节点当做普通节点,不用单独考虑了。
    let dummy = new ListNode(-1);
    dummy.next = head;

    // p1,p2,pre用来反转区域链表 
    let p1,
        p2,
        pre = null;
        
    let pre1 = dummy;
    let pos = dummy;

    // pre1指向要反转链表区域的前一个节点,
    for (let i = 0; i < m - 1; i++) {
        pre1 = pre1.next;
    }
    // pre指向要反转链表区域的第一个节点
    pre = pre1.next;
    // pos指向要反转链表区域的后一个节点
    for (let j = 0; j < n + 1; j++) {
        pos = pos.next;
    }
    // 反转区域链表  
    while (pre != pos) {
        p1 = pre.next;
        pre.next = p2;
        p2 = pre;
        pre = p1;
    }
    
    // x指向设置反转区域的最后一个节点   
    var x = pre1.next;
    // 断开第一部分和反转区域的链接
    pre1.next = null;
    // 将第一部分和反转区域进行连接 (此时反转区域的头指针为p2)
    pre1.next = p2;
    // 将反转列表区域和第二部分进行连接
    x.next = pre;

    // 返回head头节点;
    return dummy.next;
}

module.exports = {
    reverseBetween: reverseBetween,
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-29 17:30
找实习找着找着就要进入7月了,马上秋招也要开始了,找实习还有意义吗?
绝迹的星:有面就面, 没面上就当日薪4位数大佬免费培训, 面上了再考虑要不要实习
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 16:22
点赞 评论 收藏
分享
Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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