ListNode* reverseKGroup(ListNode* head, int k) {
if( !head || k==1 )return head;
int num = 0;
ListNode * cur = head;
while(cur!=NULL){++num;cur = cur->next;}
ListNode * ghost = new ListNode;ghost->val = 0;
ListNode * front, * middle , * back;
ghost->next = head;
cur = ghost;
while(num>=k){
back = cur->next;
middle = cur->next->next;
front = cur->next->next->next;
for(int i=0;i<k-1;i++){
middle ->next = back;
back = middle;
middle = front;
if( front!=NULL )front = front->next;
}
cur->next->next = middle;
ListNode *tmp = cur->next;
cur->next = back;
cur = tmp ;
num -= k;
}
return ghost->next;
}
另一个解法:
class Solution
{
public:
ListNode* reverse(ListNode* first, ListNode* last)
{
ListNode* prev = last;
while ( first != last )
{
auto tmp = first->next;
first->next = prev;
prev = first;
first = tmp;
}
return prev;
}
ListNode* reverseKGroup(ListNode* head, int k)
{
auto node=head;
for (int i=0; i < k; ++i)
{
if ( ! node )
return head; // nothing to do list too sort
node = node->next;
}
auto new_head = reverse( head, node);
head->next = reverseKGroup( node, k);
return new_head;
}
};
另一个很巧妙的解法,在每次的reverse调用中,都会传k+1个元素,并且prev最开始设置称为最后一个元素,将其看成一个环路。