题目:
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.
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head, int k) {
ListNode *last = head, *first = head, *cur = NULL;
while (k-- > 1)
{
cur = last->next;
last->next = cur->next;
cur->next = first;
first = cur;
}
head = first;
return head;
}
ListNode* reverseKGroup(ListNode* head, int k) {
int count = 1;
ListNode *p = head, *pre = NULL;
while (p != NULL && count < k)
{
count++;
p = p->next;
}
if (p == NULL)
return head;
pre = head;
p = p->next;
head = reverseList(head, k);
while (p != NULL)
{
for (count = 1; count < k && p != NULL; count++)
p = p->next;
if (p != NULL)
{
p = p->next;
pre->next = reverseList(pre->next, k);
for (count = 0; count < k; count++)
pre = pre->next;
}
}
return head;
}
};
题外话:
新的一年,希望家人身体可以健健康康,我也要好好调整作息,注意身体!大家都保重身体!