leetCode: 25. K 个一组翻转链表

138 阅读1分钟

题目

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

解题思路

遍历链表,取开始和结束长度为k个的节点进行反转,注意判断临界条件,如果end节点为空,直接返回结果

var reverseKGroup = function(head, k) {
    if(head === null || head.next === null) return head;

    const virtualNode = new ListNode(0);
    virtualNode.next = head;

    // 设定pre节点和end节点,由此来反转k个节点
    let pre = virtualNode, end = virtualNode;

    // end的next节点为空则终止循环
    while(end.next) {
        // 找到一段循环中的end节点
        for (let i = 0; i < k && end !== null; i++) {
            end = end.next;
        }

        // 如果end为空, 说明链表走到了最后,跳出循环
        if (end === null) {
            break;
        }

        // 截取需要反转的链表
        let start = pre.next;
        let curr = end.next;
        end.next = null;
        // 反转start开始的链表,并将反转后的链表的头节点与pre相连
        pre.next = reverse(start);
        start.next = curr;

        pre = start;
        end = pre;
    }

    return virtualNode.next;
};

function reverse(head) {
    let pre = null, curr = head;
    while(curr) {
        const next = curr.next;
        curr.next = pre;
        pre = curr;
        curr = next;
    }

    return pre;
}