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.
题目:将链表右移k位。何为右移:
比如有链表:1->2->3
k = 1 , 3->1->2
k = 2 , 2->3->1
k = 3 , 1->2->3
k = 4 , 3->1->2
其实这道题可以用快慢指针来解,不需要计算链表长度,但是:
不计算链表长度版本,但如果k值很大的时候不能AC,运行时间过长..
ListNode* rotateRight(ListNode* head, int k) {
/*[1, 2, 3]
2000000000 超时*/
if (!head) return NULL;
ListNode **pp = &head; //慢指针
ListNode **fast = &head; //快指针
for (int i = 0; i < k; i++)
{
if (!(*fast))
{
fast = &head;
}
fast = &((*fast)->next);
}
if (!(*fast) || (*fast == head))
{
return head;
}
while (*fast)
{
fast = &((*fast)->next);
pp = &((*pp)->next);
}
*fast = head;
head = *pp;
*pp = NULL;
return head;
最终版本:
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (!head) return NULL;//空链表
ListNode **pp = &head;
int length = 0;
while (*pp)
{
++length;
pp = &((*pp)->next);
}
ListNode **pre = &head;
if (k %= length)
{
for (int i = 0; i < length - k; ++i) {
pre = &((*pre)->next);
}
*pp = head;
head = *pre;
*pre = NULL;
}
return head;
}
};