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;
}

你可能感兴趣的:(LeetCode,C++,linklist,reverse)