非递归:分成K组,每一组单独调用普通的链表反转函数。
class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { ListNode * dummy = new ListNode(0); dummy->next = head; ListNode *pre = dummy, *temp = dummy; while(temp->next != nullptr) { for(int i = 0; i < k && temp != nullptr; i++) temp = temp->next; if(temp == nullptr) break; ListNode *oldHead = pre->next; ListNode *nextOldHead = temp->next; temp->next = nullptr; ListNode *newHead = reverse(oldHead); pre->next = newHead; oldHead->next = nextOldHead; pre = oldHead, temp = oldHead; } return dummy->next; } ListNode* reverse(ListNode *head) { ListNode *pre = nullptr, *curr = head; while(curr != nullptr) { ListNode *next = curr->next; curr->next = pre; pre = curr; curr = next; } return pre; } };
递归方法:
class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { if(head == nullptr || head->next == nullptr) return head; ListNode * pTail = head; for (int i = 0; i < k; i++) { if (pTail == nullptr) return head; pTail = pTail->next; } ListNode *newHead = reverse(head, pTail); head->next = reverseKGroup(pTail, k); return newHead; } ListNode* reverse(ListNode *head, ListNode *tail) { ListNode *pre = nullptr, *curr = head; while(curr != tail) { ListNode *next = curr->next; curr->next = pre; pre = curr; curr = next; } return pre; } };