题目描述:Given a linked list, rotate the list to the right by k places, where k is non-negative.
(给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。)
Example 1:
Input: 1->2->3->4->5->NULL, k = 2 Output: 4->5->1->2->3->NULL Explanation: rotate 1 steps to the right: 5->1->2->3->4->NULL rotate 2 steps to the right: 4->5->1->2->3->NULL
Example 2:
Input: 0->1->2->NULL, k = 4 Output:2->0->1->NULL
Explanation: rotate 1 steps to the right: 2->0->1->NULL rotate 2 steps to the right: 1->2->0->NULL rotate 3 steps to the right:0->1->2->NULL
rotate 4 steps to the right:2->0->1->NULL
分析:本题我们有两种思路来解决这个问题,我们一一来分析一下(以1->2->3->4->5->NULL,K=2为例):
思路一:基于倒数第K个节点的链表题,我们很容易想到快慢指针法先找到倒数第K个节点,然后进行一系列的操作,具体的做法如下图:
代码实现如下:
ListNode* rotateRight(ListNode* head, int k)
{
if(head==NULL||k<=0)
return head;
ListNode* cur=head;
int length=1;
while(cur->next)
{
++length;
cur=cur->next;
}
int m=k%length;
ListNode* fast=head;
ListNode* slow=head;
for(int i=0;i<m;++i)
{
if(fast!=NULL)
{
fast=fast->next;
}
else
{
fast->next=head;
}
}
while(fast->next)
{
fast=fast->next;
slow=slow->next;
}
fast->next=head;
fast=slow->next;
slow->next=NULL;
return fast;
}
思路二:将链表串成一个环,然后就是找倒数第K个节点和解链的事情了,具体做法如下图:
代码实现如下:
ListNode* rotateRight(ListNode* head, int k)
{
if(head==NULL||k<=0)
return head;
ListNode* cur=head;
int length=1;
while(cur->next)
{
++length;
cur=cur->next;
}
cur->next=head;
int m=k%length;
for(int i=0;i<length-m;++i)
{
cur=cur->next;
}
head=cur->next;
cur->next=NULL;
return head;
}