力扣25.K个一组反转链表(JavaScript)

题目要求

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

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

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例

示例 1:

力扣25.K个一组反转链表(JavaScript)_第1张图片

 
  
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

思路

  1. 检查剩余节点数量:首先确定当前剩余的节点是否足够 k 个。如果不足,直接返回当前头节点。

  2. 翻转当前 k 个节点:使用迭代的方法翻转当前 k 个节点。

  3. 递归处理后续节点:将翻转后的尾节点(即原头节点)连接到后续处理的结果上,递归处理剩余节点。

  4. 返回新的头节点:每次翻转后的新头节点作为结果返回。

代码

var reverseKGroup = function(head, k) {
    // 检查是否有足够的k个节点
    let curr = head;
    let count = 0;
    while (count < k && curr) {
        curr = curr.next;
        count++;
    }
    //节点不足,返回当前头节点
    if (count < k) {
        return head;
    }
    
    // 反转前k个节点
    let prev = null;
    let current = head;
    for (let i = 0; i < k; i++) {
        const nextNode = current.next;
        current.next = prev;
        prev = current;
        current = nextNode;
    }
    
    // 递归处理后续链表,并将当前组的尾节点连接到后续结果
    head.next = reverseKGroup(current, k);
    
    // 返回反转后的头节点
    return prev;
};

代码解释

  1. 检查节点数量:通过遍历链表的前 k 个节点,判断是否有足够节点进行翻转。如果不足,直接返回当前头节点。

  2. 翻转节点:使用三个指针(prevcurrentnextNode)翻转当前 k 个节点。每次迭代将当前节点的指针指向前一个节点,直到完成 k 次翻转。

  3. 递归处理后续节点:翻转后的尾节点(原头节点)连接到递归处理后续节点的结果上。

  4. 返回结果:每次递归返回翻转后的新头节点,最终形成完整的翻转链表。

通过递归和迭代结合的方式,确保每 k 个节点翻转,处理剩余节点不足时直接返回。

你可能感兴趣的:(leetcode,链表,javascript)