/** 想想大牛 怎么做
反转链表, 头插法 需要一个头指针
建立一个头指针 
k-1次头插,更新 头指针 
*/

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(head == NULL||k==1) return head;
        ListNode *res = new ListNode(0);
        res->next = head; // 建立一个头指针
        int len = 0;
        ListNode *pre = res, *cur = head, *tmp;

        while(head != NULL){
            len++;
            head = head->next;
        }

        for(int i = 0; i < len/k; i++){
            for(int j = 1; j < k; j++){ // 头插法k-1次
                tmp = cur->next; // tmp 代表摘下的节点
                cur->next = tmp->next; // 将节点摘下
                tmp->next = pre->next; // 将摘下的节点连接到
                pre->next = tmp;
            }
            pre = cur; // 更改头指针 为上一个翻转的尾结点
            cur = cur->next; // 指向下一组的第一个结点。
        }

        return res->next;

        }
};