Reverse Nodes in k-Group(leetcodeとは異なる)


テーマがどういう意味なのか理解できなかったが、自分が別の状況を実現した.
/*
          ,         :
 Input:
 [0,3,8,4,1,9,3]
 9
 Output:
 [3,0,4,8,9,1,3]
 
  k<sum,   k ; k>sum,    k%sum ; k=1  k%sum=1, return head
 
 */
ListNode* reverseKGroup(ListNode* head, int k) {
    
    if(head == NULL || head->next == NULL || k==1)
        return head;
    ListNode* p1=head, *p2 = head, *ends = head,*begins = head;
    ListNode* p = head;
    int sum = 0;
    while(p){
        ++sum;
        p = p->next;
    }
    if(k>=sum)
        k = k%sum;
    if(k==0){
        p2 = p1->next;
        p = head;
        while(p2){
            p1->next = p;
            if(p == head)
                p->next = NULL;
            p = p1;
            p1 = p2;
            p2 = p2->next;
        }
        p1->next = p;
        head = p1;
    }else{
        int times = sum/k;
        int i = 1;
        ListNode* paper = new ListNode(0); //      ,           
        ListNode* pp = paper;
        while(i <= times){
            p = begins;
            p1 = begins;
            p2 = begins;
            int s = k;
            while(--s)
                p2 = p2->next;
            begins = p2->next;
            p2->next = NULL;
            //ends = p2;
            
            p1 = p->next;
            p2= p1->next;
            p1->next = p;
            p->next = NULL;
            
            while(p2 != NULL){
                //           
                p = p1;
                p1 = p2;
                p2 = p2->next;
                p1->next = p;
                
                
            }
            /*
             p = p1;
             p1 = p2;
             p1->next = p;
             */
            pp->next = p1;
            while(pp->next!=NULL)
                pp = pp->next;
            ++i;
        }
        if(sum%k != 0 )
            pp->next = begins;
        head = paper->next;
    }
    return head;
}