The question is not difficult, but error-prone, and various boundary conditions need to be considered.
The non-recursive code is as follows:
ListNode *reverseKGroup(ListNode *head, int k) { if (head == NULL || k <= 1) return head; ListNode * start = NULL, * end = NULL, *newHead = NULL, *preEnd = NULL; while (true) { preEnd = end; if (!check(head, k)) { if (preEnd) preEnd->next = head; if (!newHead) newHead = head; return newHead; } reverse(head, k, &start, &end, &head); if (!newHead) newHead = start; if (preEnd) preEnd->next = start; } end->next = NULL; return newHead; } bool check(ListNode* head, int k) { for (int i = 1; i <= k; i++, head = head->next) { if (head == NULL) { return false; } } return true; } void reverse(ListNode *head, int k, ListNode** newHead, ListNode ** newTail, ListNode ** nextHead) { ListNode * pre, * next = head->next, * cur = head; * newTail = cur; for (int i = 2; i <= k; i++) { pre = cur; cur = next; next = cur->next; cur->next = pre; } * newHead = cur; * nextHead = next; }
It would be easier to use recursive writing:
ListNode *reverseKGroup(ListNode *head, int k) { if (k <= 1 || !check(head, k)) return head; ListNode* start, *end; reverse(head, k, &start, &end, &head); end->next = reverseKGroup(head, k); return start; } bool check(ListNode* head, int k) { for (int i = 1; i <= k; i++, head = head->next) if (head == NULL) return false; return true; } void reverse(ListNode *head, int k, ListNode** newHead, ListNode ** newTail, ListNode ** nextHead) { ListNode * pre, * next = head->next, * cur = head; * newTail = cur; for (int i = 2; i <= k; i++) { pre = cur; cur = next; next = cur->next; cur->next = pre; } * newHead = cur; * nextHead = next; }
Reverse nodes in K-group [leetcode] recursive and non-recursive Solutions