非递归:分成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;
}
};


京公网安备 11010502036488号