/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    //反转链表
    ListNode * reverseListNode(ListNode * head){
        ListNode *pre=nullptr;
        ListNode *now=head;
        while(now!=nullptr){
            ListNode *last=now->next;
            now->next=pre;
            pre=now;
            now=last;
        }
        return pre;
    }
    ListNode* reverseKGroup(ListNode* head, int k) {
        //临时节点
        ListNode *dummy=new ListNode(-1);
        dummy->next=head;
        ListNode *start=head;
        //每一次反转的前一个节点
        ListNode *pre=dummy;
        //每一次反转的最后一个节点
        ListNode *lastTempNode=nullptr;
        int cnt=0;
        while(start!=nullptr){
            lastTempNode=start;
            //每次反转之后,的下一个节点
            start=start->next;
            cnt++;
            if(cnt==k){
                cnt=0;
                //反转开始的头节点
                ListNode *tempHead=pre->next;
                //反转的最后一个节点指向空
                lastTempNode->next=nullptr;
                ListNode* newStart=reverseListNode(tempHead);
                //反转完之后,pre节点指向新的头节点
                pre->next=newStart;
                //反转完之后,新的尾节点指向下一个节点
                tempHead->next=start;
                //重新赋值头节点
                pre=tempHead;
            }
        }
        return dummy->next;
    }
};