/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* reverseONE(ListNode* headone, int k){  //反转链表,增加处理头尾节点的部分
        ListNode* curr = headone->next;
        ListNode* prev = nullptr;
        ListNode* tail = headone->next;  //记录这组新的尾

        while(k--){
            ListNode* temp = curr->next;
            curr->next = prev;
            prev = curr;
            curr = temp;
        }

        tail->next = curr;  //把新的尾连接到下一组的头;
        headone->next = prev;  //把上一组的尾连接到这组的头;

        return headone = tail;
    }

    ListNode* reverseKGroup(ListNode* head, int k) {  //主函数
        ListNode* node = head;
        int nums = 0;
        while(node){   //统计有多少个节点
            ++nums;
            node = node->next;
        }
        int groupnums = nums/k;  //计算多少组

        ListNode dummy(0);    //头结点处理
        dummy.next = head;
        node = &dummy;
        for(int i=1; i <=groupnums; i++){  //每组处理
            node = reverseONE(node, k);  //返回时更新下一组的头
        }

        return dummy.next;
    }
};