LC 25链表困难第 33 / 95 题

K 个一组翻转链表

Reverse Nodes in k-Group

链表分组反转
本机进度仅保存在当前浏览器

题目描述

给你链表的头节点 head,每 k 个节点一组进行翻转,请你返回修改后的链表。节点总数不是 k 的整数倍时,最后剩余节点保持原有顺序。要求只使用常数额外空间,不能只改节点值。

示例:1 -> 2 -> 3 -> 4 -> 5,k = 3,输出 3 -> 2 -> 1 -> 4 -> 5。

解题思路

  1. 分组处理:先从当前组头探测是否凑满 k 个节点,不足则直接结束。
  2. 凑满则对这一组内部执行标准反转(同 206 题),返回新的组头与组尾。
  3. 把上一组的组尾接到新组头,再从原组尾(新组尾)继续处理下一组;用哑节点统一第一组的接法。
  4. 关键细节:探测与反转都要小心保持对"下一组起点"的引用,防止断链丢失。

参考实现

查看参考实现Python · 建议先自行作答
def reverseKGroup(head, k):
    dummy = ListNode(0, head)
    prev_group = dummy
    while True:
        # 探测本组第 k 个节点是否还存在
        end = prev_group
        for _ in range(k):
            end = end.next
            if not end:
                return dummy.next
        start = prev_group.next
        nxt_group = end.next
        # 组内反转 [start, end]
        prev, cur = nxt_group, start
        while cur != nxt_group:
            tmp = cur.next
            cur.next = prev
            prev = cur
            cur = tmp
        prev_group.next = end
        prev_group = start

复杂度与归属

时间复杂度O(n)
空间复杂度O(1)
所属分类链表
题源LeetCode 25

关联教程

返回题图鉴