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

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    // 第一和函数反转以a为头结点的链表
    ListNode* reverse(ListNode* a) {
        ListNode* pre; // 前一个要拼接的点
        ListNode* cur;  // 当前的点
        ListNode* next;  // 要挪动的下一个点
        pre =nullptr;   
        cur = a;
        next = a;

        while(cur!=nullptr) {
            next = cur->next;
            cur->next=pre;
            pre = cur;
            cur=next;
        }
        return pre;
    }


    // 反转[a,b)区间内的元素
    ListNode* reverse(ListNode* m, ListNode* n) { // 维持区间[m,n)左闭右开的区间大小
        ListNode* pre; // 前一个要拼接的点
        ListNode* cur;  // 当前的点
        ListNode* next;  // 要挪动的下一个点
        pre =nullptr;   
        cur = m;
        next = m;
        while(cur!=n) {
            next=cur->next;
            cur->next=pre;
            pre=cur;
            cur=next;
        }
        return pre;
    }

    // 这个就相当于
    // a->b->c->d->e->f->null   反转 b->c->d   得到的结果就是 d->c->b->nullptr



    ListNode* reverseKGroup(ListNode* head, int k) {
        // write code here
        if(head==nullptr) {
            return head;
        }
        ListNode* a;
        ListNode* b;
        a=b=head;

        for(int i=0;i<k;i++) {
            if(b==nullptr) {
                return head;
            }
            b=b->next;
        }

        ListNode* new_head = reverse(a,b);
        a->next = reverseKGroup(b, k);
        return new_head;
    }
};