K 个一组翻转链表(迭代解法)
K 个一组翻转链表 是链表操作类算法题中的经典进阶题,融合了「链表反转」的核心逻辑,并需处理分组、边界拼接等复杂场景。本文将从问题拆解、核心思路、代码解析、执行流程模拟四个维度,详解这道题的迭代解法。
问题描述
题目要求
给定链表头节点 head,每 k 个节点一组进行翻转,返回修改后的链表。
k为正整数,且小于或等于链表长度。- 若节点总数不是
k的整数倍,最后剩余节点保持原有顺序。 - 不能只改变节点内部值,需实际进行节点交换。
示例
- 输入:
head = [1,2,3,4,5], k = 2 - 输出:
[2,1,4,3,5] - 输入:
head = [1,2,3,4,5], k = 3 - 输出:
[3,2,1,4,5]
链表节点定义
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
核心思路拆解
核心是「分组反转 + 边界拼接」,拆解为 3 个关键步骤:
- 统计链表长度:确定能分成多少个完整的
k节点组; - 虚拟头节点兜底:用
dummy节点统一 '首组反转' 和 '后续组反转' 的拼接逻辑; - 分组反转 + 拼接:对每一组
k个节点执行「链表反转」,并将反转后的组与前一组、后一组正确拼接。
完整代码
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
// 步骤 1:统计链表总长度
int n = 0;
for (ListNode cur = head; cur != null; cur = cur.next) {
n++;
}
// 步骤 2:创建虚拟头节点
ListNode (, head);
dummy;
;
head;
(; n >= k; n -= k) {
( ; i < k; i++) {
cur.next;
cur.next = pre;
pre = cur;
cur = nxt;
}
p0.next;
p0.next.next = cur;
p0.next = pre;
p0 = nxt;
}
dummy.next;
}
}

