/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(!head)    return head;

        // 每一段链表的尾为向后走 K个结点,若不足 K则返回 head
        ListNode* tail = head;
        for(int i=0; i<k; i++) {
            if(!tail)    return head;
            tail = tail->next;
        }

        // 新的头即为第一次反转的返回值,尾即为原来节点的 head。
        ListNode* newHead = revers(head, tail);
        head->next = reverseKGroup(tail, k);   // 递归的调用reverseKgroup,新的头即为上一次的尾

        return newHead;
    }

    // 反转从节点 head到 tail的链表。返回值即原链表节点 tail的前一个节点。
    ListNode* revers(ListNode* head, ListNode* tail) {
        if(head==tail)    return head;

        ListNode* cur = head;
        ListNode* pre = nullptr;
        // 注意此处为 cur!=tail, 逻辑才正确。
        while(cur!=tail) {
            ListNode* next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }

        return pre;
    }
};