题解 | #链表中的节点每k个一组翻转#

链表中的节点每k个一组翻转

https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

思路:
把k个节点传入反转函数;
注意点:
1、反转之后节点之间的关系要处理好;
2、把反转区间的头节点,结束节点传入反转的函数在一定程度上方便处理
3、为了方便处理关系,需要记录开始反转的上一个节点以及反转结束的下一个节点

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
 *
 * @param head ListNode类
 * @param k int整型
 * @return ListNode类
 */
function reverseKGroup(head, k) {
    // write code here
    let dummyHead = new ListNode("");
    dummyHead.next = head;
    let prev = dummyHead;
    while (head) {
        let tail = prev;
        for (let i = 0; i < k; i++) {
            tail = tail.next;
            if (!tail) {
			  // 不满足直接返回即可
               return dummyHead.next;
            }
        }
        // 记录反转的结束点的下一个节点
        let next = tail.next;
        // 反转的开始节点、结束节点
        [head, tail] = myReverse(head, tail);
        // 重新构建指针
        prev.next = head;
        tail.next = next;
        // 移动指针
        prev = tail;
        head = prev.next;
    }
    return dummyHead.next;
}
function myReverse(head, tail) {
    let prev = tail.next;
    let cur = head;
    // 结束条件
    while (prev !== tail) {
        const nextNode = cur.next;
        cur.next = prev;
        prev = cur;
        cur = nextNode;
    }
    return [tail, head];
}
module.exports = {
    reverseKGroup: reverseKGroup,
};

全部评论

相关推荐

10-29 15:38
门头沟学院 Java
榕城小榕树:难道你简历里写了配送路径优化算法?
点赞 评论 收藏
分享
11-08 10:39
门头沟学院 C++
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务