61. Rotate List (旋转链表)
1. 题目翻译
给定一个单链表,将链表中后K个结点移动到链表前面,K为非负整数。
例子:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.
2. 解题方法
首先要考虑到两个特殊输入,当给定的链表为空时,不管K的值为多少,都返回空。当K的值比链表长度要大时,K的值应该K对链表长度取余,这样得到的值一定比链表长度要小。
遍历链表,求出链表长度,并将链表最后一个结点的next域指向头结点,这样变成一个循环链表。因为要将后K个结点移动到前面,所以我们再次遍历一次链表,让P指向倒数K+1个结点(因为我们刚才求出了链表的长度,所以这步一次遍历就可以解完成)。例如,在上方的例子中,完成这步后,p指向3。很显然p->next域指向的是第一个要移动到前的结点,而p本身就应该是完成旋转后的最后一个结点。
让head指向p->next,然后让p->next指向NULL结点,返回head结点。
3. 代码
//Runtime: 13ms, 时间复杂度: O(n)
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (head == NULL)
return NULL;
int length = 1;
ListNode* p = head;
while(p->next){
length++;
p = p->next;
}
p->next = head;
k = k % length;
p = head;
k = length - k;
while(--k)
p = p->next;
head = p->next;
p->next = NULL;
return head;
}
};