#25
困难
高频
迭代法K个一组翻转链表
这是一道围绕链表、递归展开的高频练习。建议先掌握「迭代法」这套写法,再结合下方步骤讲解理解状态维护、边界处理和复杂度取舍。
链表
递归
题目分析
给你一个链表头节点和一个整数 k。
要求你每 k 个节点作为一组进行翻转。如果最后剩下的节点不足 k 个,就保持原样,不要翻转。
比如 1 -> 2 -> 3 -> 4 -> 5,当 k = 2 时,结果会变成 2 -> 1 -> 4 -> 3 -> 5。
一句话概括:
把链表按长度为 k 的小段切开,每一段单独反转,再按顺序接回去。
接下来怎么看推荐代码: 带着这个理解再看推荐代码时,重点观察这条主线:每次先检查当前组是否满 k 个,够的话原地翻转这一组,再把翻转后的头尾重新接回链表。
推荐代码
推荐解法:迭代法
时间复杂度: O(n)
空间复杂度: O(1)
核心思路: 每次先检查当前组是否满 k 个,够的话原地翻转这一组,再把翻转后的头尾重新接回链表。
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
ListNode end = dummy;
while (end.next != null) {
for (int i = 0; i < k && end != null; i++) end = end.next;
if (end == null) break;
ListNode start = pre.next;
ListNode next = end.next;
end.next = null;
pre.next = reverse(start);
start.next = next;
pre = start;
end = pre;
}
return dummy.next;
}
private ListNode reverse(ListNode head) {
ListNode pre = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;
}
结构化讲解
面试时怎么讲
开场思路
这题我会按组处理链表:先判断够不够 k 个,够就翻,不够就停。
核心过程
- 每次先向后找第 k 个节点,确认当前组长度足够。
- 保存当前组后继节点,方便翻转后接回。
- 对这一组节点做原地翻转。
- 把翻转后的新头新尾和前后链表重新连接,再进入下一组。
复杂度总结
时间复杂度 O(n),空间复杂度 O(1)。
面试补一句:这题比普通翻转更难的部分不在翻转,而在分组与接回。
核心思路
K 个一组翻转比普通链表翻转多了一个分组判断。关键是先确认这一组足够 k 个节点,再做局部翻转并和前后链表重新接上。
步骤讲解
1
先检查当前组是否凑够 k 个节点
从组前驱节点出发往后探测 k 次,不够就直接结束。
为什么这样做:题目要求最后不足 k 个的节点保持原样,不能强行翻转。
对应代码提示:for (int i = 0; i < k && node != null; i++) node = node.next;
2
原地翻转这一组节点
记录组尾后继,然后对当前 k 个节点做标准链表翻转。
为什么这样做:每组内部都可以视作一段独立链表进行反转。
对应代码提示:ListNode groupNext = kth.next;
3
把翻转后的新头新尾重新接回
前驱接到新组头,原组头变成新组尾,再连回下一组起点。
为什么这样做:局部翻转后,真正麻烦的是把链表整体结构重新接好。
对应代码提示:groupPrev.next = newHead; oldHead.next = groupNext;
易错点
没先判断是否满 k 个
会错误翻转最后不足 k 个的节点。
正确理解:每轮开始都先探测当前组长度。
翻转后没接回后继
链表很容易在组边界处断开。
正确理解:翻转前先保存
groupNext,翻转后再接回。组前驱更新错位
下一轮会从错误位置开始,导致重复翻转或漏节点。
正确理解:每轮结束后把组前驱移动到翻转后的组尾。
复杂度与适用判断
时间复杂度:O(n)
空间复杂度:O(1)
比其他方案更好在哪里:比每组拷贝到数组再逆序更省空间,也更贴合链表题的原地操作要求。
适用判断:链表题涉及固定长度分组翻转时,优先考虑“先探测,再局部翻转”的模板。
额外提醒
- 不足 k 个不翻转,是这题和普通局部翻转最大的区别。
动画演示
如果你还没完全看懂,可以展开动画演示。
迭代法动画演示
想看这段解法是怎么一步步运行的,可以展开动画继续观察。
迭代法动画演示
想看这段解法是怎么一步步运行的,可以展开动画继续观察。
准备就绪 - 输入链表值(用逗号分隔)和k值,然后点击开始
动画演示仅在桌面端提供,移动端请优先阅读推荐代码与结构化讲解。