class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(!head || k <= 1) return head; //空指针及不需要翻转的情况直接返回head
        ListNode* pre = nullptr; //记录前一个ListNode
        ListNode* cur = head; //记录当前ListNode
        ListNode* next = nullptr; //记录后一个ListNode
        for(int i = 0; i < k; i++) { //检测ListNode数量是否大于k
            if(!cur) return head; //若不大于直接返回头
            cur = cur->next; //指向下一个ListNode
        }
        cur = head; //检测完毕后cur复原成头
        for(int i = 0; i < k; i++) {
            next = cur->next; //记录后一个ListNode
            cur->next = pre; //cur指向前一个ListNode
            pre = cur; //pre右移
            cur = next; //cur右移
        }
        head->next = reverseKGroup(next, k); //此时k个ListNode翻转完毕,尾(原来的头)指向递归后返回的头
        return pre; //返回新的头
    }
};