class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode*dummy=new ListNode(0);
dummy->next=head;
ListNode* tmp = dummy->next;
int step = 0; // 计数,用来找出首结点和尾结点
ListNode* startK = nullptr; // k个一组链表中的头结点
ListNode* startKPre = dummy; // k个一组链表头结点的前置结点
ListNode*endK; // k个一组链表中的尾结点
while (tmp != nullptr) {
// tmp 的下一个节点,因为由于翻转,tmp 的后继结点会变,要提前保存
ListNode* tmpNext = tmp->next;
if (step == 0) {
// k 个一组链表区间的头结点
startK = tmp;
step++;
} else if (step == k-1) {
// 此时找到了 k 个一组链表区间的尾结点(endK),对这段链表用迭代进行翻转
endK = tmp;
ListNode* pre = startK;
ListNode* cur = startK->next;
if (cur == nullptr) {
break;
}
ListNode* endKNext = endK->next;
while (cur != endKNext) {
ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
// 翻转后此时 endK 和 startK 分别是是 k 个一组链表中的首尾结点
startKPre->next = endK;
startK->next = endKNext;
// 当前的 k 个一组翻转完了,开始下一个 k 个一组的翻转
startKPre = startK;
step = 0;
} else {
step++;
}
tmp = tmpNext;
}
return dummy->next;
}
};