struct ListNode* reverseKGroup(struct ListNode* head, int k) {
    struct ListNode *begin;
    struct ListNode *tail;
    struct ListNode root;
    struct ListNode *prev;
    int i;

    root.next = head;
    prev = &root;
    while(head){
        i = 1;
        begin = head;
        while(head && i < k){
            head = head->next;
            i++;
        }

        if(head == NULL)
            goto out;
        tail = head->next;
        head->next = NULL;
        prev->next = reverseNode(begin);
        prev = begin;
        prev->next = tail;
        head = prev->next;
    }

out:
    return root.next;
}
Example #2
0
ListNode* reverseKGroup(ListNode* head, int k) {
	if(head == NULL || k<=1) {
		return head;
	}
	 

	ListNode* cur = head, *pre=head, *next;
	int m=1;
	
	while(m < k && cur) {
		m++;
		cur = cur->next;
	}
	if(cur) {
    	next = cur->next;
    	cur->next = NULL;
    	pre = reverseNode(head);
    	ListNode *tail = pre;
    	while(tail->next) {
    	    tail = tail->next;
    	}
    	tail->next = reverseKGroup(next, k);
	}

	
	return pre;
}
 ListNode* reverseKGroup(ListNode* head, int k) {
     ListNode* startNode = head, *endNode = head,*pPre = head, *pNext,*result = head;
     int IsFirstTime = 1,i;
     
     if(k <= 1 || head == NULL || head->next == NULL)
         return head;
     
    
    
     //at least has 2 elements
     while(startNode!=NULL){
         
         endNode = startNode;
         
         for(i = 1;i<k;i++){
             if(endNode->next == NULL)
                 break;
             endNode = endNode->next;
         }
         //if this is the first time to reverse and there are not enough element in the list
         if(i!=k)
             break;
             
         pNext = endNode->next;
         
         reverseNode(startNode,endNode);
         
         if(IsFirstTime ==1){
             result = endNode;
             IsFirstTime =0;
             pPre = startNode;
         }else{
             pPre->next = endNode;
             pPre =startNode;
             
         }
         startNode->next = pNext;
         startNode = pNext;
         
     }
     
     return result;
 }