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

链表内指定区间反转

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

全部评论

相关推荐

牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
找不到工作死了算了:没事的,雨英,hr肯主动告知结果已经超越大部分hr了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务