题目:
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
Example:
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
Note:
- Only constant extra memory is allowed.
- You may not alter the values in the list's nodes, only nodes itself may be changed.
代码:
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if (!head)return NULL;
if (!head->next)return head;
ListNode* first=new ListNode(-1);
first->next = head;
ListNode* p = head;
int t = 0;
while (p) {
t++;
p = p->next;
}
int times = t / k;
ListNode* current = NULL;
ListNode* q = head;
int i = 0;
while ((times--)>0) {
int m = k;
while ((--m)>0) {
if (i == 0) {
ListNode* m = q->next;
q->next = m->next;
m->next = first->next;
first->next = m;
}
else {
ListNode* m = q->next;
q->next = m->next;
m->next = current->next;
current->next = m;
}
}
current = q;
q = current->next;
++i;
}
return first->next;
}
};