/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @param k int整型 
 * @return ListNode类
 */


struct ListNode* reverseKGroup(struct ListNode* head, int k ){//函数命名相似程度很高的话,不利于后续集体修改
     struct ListNode* sample;
     //计算string的长度
     sample=head;
     int count=0;
     while(sample){
         sample=sample->next;
         count++;
     }
       //算出重复次数
     count=count/k;

     sample=(struct ListNode*)malloc(sizeof(struct ListNode));//这里要申请单位才可以给他的next赋值,重新定义sample的位置,是头节点前面的头节点,因为这个题目中的链表不带头节点
     sample->next=head;

     struct ListNode* sample1;//移动到i次要交换的最后一格位置,同时将sample1后面切断
     struct ListNode* sample2;//移动到i次交换位置第一格,方便后续头插法
     struct ListNode* sample2n;//头插法,方便sample2后续移动
     struct ListNode* sample3;//sample2前面一格的位置,代替头节点

     for(int i=1;i<=count;i++)
     {
         sample1=sample;
          sample2=sample;
          sample3=sample;
         for(int j=0;j<k*i;j++)
         {
             sample1=sample1->next;
         }


         for(int q=0;q<k*(i-1)+1;q++){
             sample2=sample2->next;
         }


         for(int p=0;p<k*(i-1);p++){
             sample3=sample3->next;
         }

//头插法
         sample3->next=sample1->next;
         sample1->next=NULL;

         while(sample2)
         {
            sample2n=sample2->next;

             sample2->next=sample3->next;
             sample3->next=sample2;

             sample2=sample2n;
         }
     }
     return sample->next;//这里return head和return sample->next的效果一样