Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
For 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
解题思路:
(1)编写链表翻转子函数reverse()
(2)对原链表以k为周期进行翻转处理
struct ListNode* reverse(struct ListNode* start, struct ListNode* end, struct ListNode* nextEnd)
{
struct ListNode* preNode = nextEnd;
struct ListNode* pNode = start;
while (end != preNode)
{
struct ListNode* nextNode = pNode->next;
pNode->next = preNode;
preNode = pNode;
pNode = nextNode;
}
return end;
}
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
if (head == NULL || k == 1)
return head;
struct ListNode* preStart = NULL;
struct ListNode* start = head;
struct ListNode* end = head;
while (1)
{
int i;
for (i = 1; i < k; i++)
{
if (end->next != NULL)
end = end->next;
else
break;
}
if (i < k)
break;
struct ListNode* nextEnd = end->next;//end结点的后继结点
struct ListNode* temp = reverse(start, end, nextEnd);//将链表翻转
if (preStart == NULL)
{
head = temp;
head->next = temp->next;
}
else
preStart->next = temp;
//此时start结点经翻转后成为最后一个结点
preStart = start;
//链表结点个数正好是k的整数倍
if (nextEnd == NULL)
break;
end = nextEnd;
start = nextEnd;
}
return head;
}