题目
Given a list, rotate the list to the right by k places, where k is non-negative.
Example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.
解析
题意是让旋转一个链表,一开始想到的是快慢指针,但是实现之后发现十分的麻烦,有许多指针移动的操作。实际上可以使用环解决这个问题。下面贴上两种解决办法
代码
拖沓的快慢指针方法
/**
* 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||!head->next) return head;
ListNode *p=head;
int len=0;
while(p){
p=p->next;
len++;
}
p=head;
k=k%len;
if(!k) return head;
while(k&&p->next){
p=p->next;
k--;
}
if(k>0) return head;
ListNode * tmp=head;
while(p->next){
tmp=tmp->next;
p=p->next;
}
ListNode *new_head=tmp->next;
tmp->next=NULL;
p=new_head;
while(p->next){
p=p->next;
}
p->next=head;
return new_head;
}
};
用环来解决:
/**
* 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||!head->next) return head;
int len=1;
ListNode *nHead,*tail;
nHead=tail=head;
while(tail->next){
tail=tail->next;
len++;
}
tail->next=head;
if(k%=len){
for(int i=0;i<len-k;i++)
tail=tail->next;
}
nHead=tail->next;
tail->next=NULL;
return nHead;
}
};