🧩Algo 链表
25. K 个一组翻转链表
难度:🔴 Hard | 标签:链表 | 状态:⬜ LeetCode 链接
思路
分段反转。每次先数 k 个节点,够才反转;不够保持原样。
dummy + groupPrev 锚定每段前驱。
代码
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode dummy(0, head), *gPrev = &dummy;
while (true) {
ListNode* kth = gPrev;
for (int i = 0; i < k && kth; ++i) kth = kth->next;
if (!kth) break;
ListNode *groupNext = kth->next;
// reverse [gPrev->next, kth]
ListNode *prev = groupNext, *cur = gPrev->next;
while (cur != groupNext) {
ListNode* nxt = cur->next;
cur->next = prev;
prev = cur;
cur = nxt;
}
ListNode *tmp = gPrev->next;
gPrev->next = kth;
gPrev = tmp;
}
return dummy.next;
}
};
复杂度
- 时间 O(n),空间 O(1)
易错 / 回顾
- 不够 k 个时不反转,直接 break
- 反转范围用
prev = groupNext初始化,省去断尾步骤 - gPrev 跳到本组反转后的尾(即原来的头)
Related · 链表