/**
 * 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类
     */
  /*
  核心思想是 每k个元素看作是一个子链表,做该子链表的逆序,一共做 len/k次
  逆序的做法是 在头节点后面不断插入新遍历的节点
  */
    ListNode* reverseKGroup(ListNode* head, int k) {
        // write code here
        ListNode* p = head;
        int cnt = 0;
        struct ListNode* h = (struct ListNode*)malloc(sizeof(struct ListNode*));
        int len = 0;  //链表长度
        ListNode* q = head;
        while(q){
            len++, q= q->next;
        }
	  	// 记录每次 链表倒置时的最后一个位置
        ListNode* last = nullptr;
	  // 记录每次 链表倒置
        ListNode* lastn = nullptr;
        int times = 0;
        int m = len / k;
        while (p) {
            printf("p=%d\n", p->val);
            ListNode* n = p->next;
            if (times == 0) {
                if (cnt == 0) {
                    last = p;
                    p->next = nullptr;
                } else {
                    p->next = h->next;
                }
                h->next = p;
                cnt++;
                if (cnt == k) {
                    cnt = 0;
                    times ++;
                }
            }else{
                if (cnt == 0) {
                    lastn = p;
                    p->next = nullptr;
                } else {
                    p->next = last->next;
                }
                last->next = p;
                cnt++;
                if (cnt == k){
                    cnt = 0, times++;
                    last = lastn;
                }
            }
            p = n;
            if(times==m){
                last->next = p;
                break;
            }
        }
        return h->next;


    }
};