原题: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,
For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.
给定一个链表,保留后k个结点,将之前的结点旋转到链尾。
解法:用双指针,慢指针与快指针之间相距k位。同时对k进行处理k%=length(list)。
这里的双指针可以只用一个指针替代。首先遍历一遍求得链表长度,重新计算k。然后指针从头遍历(length-k)次,重新连接链表,返回头结点。
时间复杂度为O(N)。
class Solution {
public:
ListNode *rotateRight(ListNode *head, int k) {
if(head==NULL || k<=0)
return head;
int len = 1;
ListNode *p = head;
while(p->next){
++len;
p = p->next;
}
k %= len;
p->next = head;//circle list
p = head;
for(int i=1;i<len-k;++i)//move (len-k-1) times
p = p->next;
head = p->next;
p->next = NULL;
return head;
}
};