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