// ── REVERSE K NODES ──────────────────────────────────────────────
// https://leetcode.com/problems/reverse-nodes-in-k-group/description/
// reverseKGroup(k=2)
//
// before: [1]->[2]->[4]->[5]->NULL
//
// chunk1: reverse [1],[2] → [2]->[1]
// chunk2: reverse [4],[5] → [5]->[4]
// stitch: [2]->[1]->[5]->[4]->NULL
//
// after: [2]->[1]->[5]->[4]->NULL
//
// LC 25 variant: if remaining nodes < k, leave them as-is
// e.g. [1,2,3,4,5] k=3 → [3,2,1,4,5] (4,5 untouched since 2 < k)
class Solution {
public:
pair<ListNode*, ListNode*> reverseKnodes(ListNode* head, int k) {
ListNode *prev = NULL, *curr = head;
while (curr && k != 0) {
auto nex = curr->next;
curr->next = prev;
prev = curr;
curr = nex;
k--;
}
return {prev, curr};
}
ListNode* reverseKGroup(ListNode* head, int k) {
if (head == NULL) return head;
auto tem = head;
int t = k;
while (t--) {
if (!tem) return head;
tem = tem->next;
}
auto [last, newHead] = reverseKnodes(head, k);
head -> next = reverseKGroup(newHead, k);
return last;
}
};