struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
//once the link order of the list is changed,
//we must keep the previous pointer(p in the code) updated, if we want to use it agian
public:
void reverse_range(ListNode* prev, ListNode* end, ListNode*& p)
{
ListNode* last = prev->next;
ListNode* cur = last->next;
while(cur != end)
{
last->next = cur->next;
cur->next = prev->next;
prev->next = cur;
cur = last->next;
}
p = last;
}
ListNode *reverseKGroup(ListNode *head, int k) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(k <= 1) return head;
ListNode dummy(-1);
dummy.next = head;
ListNode* prev = &dummy;
ListNode* p = dummy.next;
int cnt = 1;
while(p != NULL)
{
if(cnt%k == 0)
{
reverse_range(prev, p->next, p);//update p is very important
prev = p;
}
p = p->next;
cnt++;
}
return dummy.next;
}
};
second time
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reverseList(ListNode* head, int k, ListNode*& reverseHead, ListNode*& reverseTail, ListNode*& nextHead)
{
reverseTail = head;
ListNode* prev = head;
ListNode* cur = head->next;
for(int i = 0; i < k-1; ++i)
{
if(cur == NULL) break;
ListNode* tmp = cur->next;
cur->next = prev;
prev = cur;
cur = tmp;
}
reverseHead = prev;
nextHead = cur;
}
bool enoughSubList(ListNode* head, int k)
{
while(head != NULL && k != 0)
{
k--;
head = head->next;
}
return k==0;
}
ListNode *reverseKGroup(ListNode *head, int k) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode dummy(-1);
dummy.next = head;
ListNode* prev = &dummy;
ListNode* nextHead = head;
while(nextHead != NULL)
{
ListNode* reverseHead;
ListNode* reverseTail;
if( enoughSubList(nextHead, k) )
reverseList(nextHead, k, reverseHead, reverseTail, nextHead);
else
{
prev->next = nextHead;
break;
}
prev->next = reverseHead;
prev = reverseTail;
prev->next = NULL;
}
return dummy.next;
}
};