61. Rotate List
介绍
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
,
return 4->5->1->2->3->NULL
.
解答
这道题主要考察一个技巧的运用。快慢指针。
拿示例来进行举例,对于链表1->2->3->4->5->NULL
and k = 2
。起初快慢指针均指向头结点,我们让快指针先走 k 步,此时块指针指向3,慢指针仍指向1,然后快慢指针同时不断往前走直到快指针到达最后一个元素,即有此时快指针指向5,慢指针指向3。
此时慢指针所指元素,应该是整个链表右移k个位置之后的尾元素。而其后的元素应该是在原来的头结点之前,此时我们只需要更快慢指针中的next值,然后返回新的头结点即可。
“`cpp
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k)
{
//边界条件检查
if(!head || k == 0) return head;
//计算链表长度
int count = 0;
ListNode *cur = head;
while(cur)
{
++count;
cur = cur->next;
}
//取模,检查是否需要旋转
int num = k%count;
if(num == 0) return head;
//快慢指针,快指针先走num步
ListNode *fast = head, *slow = head;
while(num-- > 0) fast = fast->next;
//快慢指针一起走,直到快指针到达链表中最后一个结点
while(fast->next)
{
fast = fast->next;
slow = slow->next;
}
//旋转,慢指针所指的元素变为最后一个元素,慢指针后的元素变为新的头指针,快指针所指结点和原来的头结点连接在一起
ListNode *newHead = slow->next;
slow->next = nullptr;
fast->next = head;
return newHead;
}
};
“`r