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

链表内指定区间反转

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,
};

全部评论

相关推荐

05-29 09:02
门头沟学院 Java
点赞 评论 收藏
分享
lllllkin:感觉可以精简到一页简历,有些排版感觉不是必须的。 时间线越早的,你自己越熟悉的放前面。描述可以更精简些,一些问题解决感觉可以不用写具体技术栈,卖个关子,等面试官问。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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