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;
}
};
本文详细介绍了如何通过两次遍历实现链表的旋转操作。首先将链表转换为循环链表,然后找到倒数第K+1个节点,将其next指针设为null,并将链表头指针指向倒数第K个节点。
310

被折叠的 条评论
为什么被折叠?



