1.题目描述
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given 1->2->3->4->5->NULL
and k = 2
,
return 4->5->1->2->3->NULL
.
2.解题思路
这个题目的意思是移动一个链表。
首先我们要把链表变成一个环形,然后计算长度n。k取模,得到实际移动的距离。那么第n-k个节点就是新的链表的头。
然后n-k-1的节点放空就可以了。
最后加一些特别的判定,比如空链表,只有一个节点之类的。
3.实现代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
//空链表直接返回空
if(head==NULL)
return NULL;
//计算长度
ListNode *t=head;
int length=1;
while(t->next!=NULL){
t=t->next;
++length;
}
//长度为1时直接返回结果
if(length==1)
return head;
//无需移动时直接返回结果
k=k%length;
if(k==0)
return head;
//形成环形
t->next=head;
t=head;
ListNode *tt;
int i=0;
while(i<length-k-1){
t=t->next;
++i;
}
tt=t->next;
t->next=NULL;
return tt;
}
};