题解 | #牛群的重新分组#

牛群的重新分组

https://www.nowcoder.com/practice/267c0deb9a6a41e4bdeb1b2addc64c93

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head ListNode类
 * @param k int整型
 * @return ListNode类
 */
function reverseKGroup(head, k) {
    // write code here
    const dummy = new ListNode(-1);
    // 虚拟头结点
    dummy.next = head;
    // 移动指针
    let curr = dummy;
    // 每组开头的前一个位置
    let p = dummy;
    while (curr !== null) {
        // 移动 k 个位置到组的末尾位置
        for (let i = 0; i < k && curr !== null; i++) {
            curr = curr.next;
        }
        // 不足 k 位
        if (curr === null) break;
        // 暂存下组开头, 和翻转链表的头结点
        const next = curr.next;
        const groupHead = p.next;
        // 断开组的左右连接
        p.next = null;
        curr.next = null;
        // 翻转后拿到新组的头部和尾部
        const [tHead, tTail] = reverseLinkedList(groupHead);
        // 重新接回到原链表上
        p.next = tHead;
        tTail.next = next;
        // 开始下一组
        p = tTail;
        curr = tTail;
    }
    return dummy.next;
}

// 翻转链表
function reverseLinkedList(head) {
    let pre = null;
    let curr = head;
    while (curr !== null) {
        const next = curr.next;
        curr.next = pre;
        pre = curr;
        curr = next;
    }
    return [pre, head];
}
module.exports = {
    reverseKGroup: reverseKGroup,
};

全部评论

相关推荐

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