LeetCode 25. K 个一组翻转链表

25. K 个一组翻转链表

解题思路

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
// 统计链表长度
int n = 0;
ListNode node = head;
while(node != null) {
n ++;
node = node.next;
}

ListNode dummy = new ListNode(0, head);
ListNode p0 = dummy;
ListNode pre = null;
ListNode cur = head;

for(; n >= k; n -= k) {
for(int i = 0; i < k; i ++) {
ListNode nxt = cur.next;
cur.next = pre;
pre = cur;
cur = nxt;
}

ListNode nxt = p0.next;
p0.next.next = cur;
p0.next = pre;
p0 = nxt;
}
return dummy.next;
}
}

最后不足 $k$ 个的剩余节点也进行翻转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
int n = 0;
ListNode node = head;
while(node != null) {
node = node.next;
n ++;
}

ListNode dummy = new ListNode(0, head);
ListNode p0 = dummy;
ListNode pre = null;
ListNode cur = head;

for(; n >= k; n -= k) {
for(int i = 0; i < k; i ++) {
ListNode nxt = cur.next;
cur.next = pre;
pre = cur;
cur = nxt;
}
ListNode nxt = p0.next;
p0.next.next = cur;
p0.next = pre;
p0 = nxt;
}

// 反转剩余的不足k个节点
if (cur != null) {
// 先断开连接,避免循环
p0.next = null;
// 反转剩余节点
ListNode remainingPre = null;
ListNode remainingCur = cur;
while (remainingCur != null) {
ListNode nxt = remainingCur.next;
remainingCur.next = remainingPre;
remainingPre = remainingCur;
remainingCur = nxt;
}
// 连接到原链表
p0.next = remainingPre;
}

return dummy.next;
}
}

ACM 模式

1


LeetCode 25. K 个一组翻转链表
https://sowink.cn/2026/02/08/LeetCode-25-K-个一组翻转链表/
作者
Xurx
发布于
2026年2月8日
许可协议