class Solution
{
public:
ListNode *reverseKGroup(ListNode *head, int k)
{
if (head == nullptr || head->next == nullptr || k < 2)
return head;
ListNode dummy(-1);
dummy.next = head;
ListNode *preGroupEnd = &dummy;
ListNode *curGroupEnd = preGroupEnd->next;
while (curGroupEnd = preGroupEnd->next)
{
for (int i = 1; i < k && curGroupEnd; i++)
curGroupEnd = curGroupEnd->next;
if (curGroupEnd == nullptr)
break;
preGroupEnd = reverseList(preGroupEnd, preGroupEnd->next, curGroupEnd);
}
return dummy.next;
}
ListNode *reverseList(ListNode *preGroupEnd, ListNode *begin, ListNode *end)
{
ListNode *endNext = end->next;
ListNode *pre = begin;
ListNode *cur = pre->next;
ListNode *next = cur->next;
while (cur != endNext)
{
cur->next = pre;
pre = cur;
cur = next;
next = next ? next->next : nullptr;
}
begin->next = endNext;
preGroupEnd->next = end;
return begin;
}
};