目录
题目描述:
解题思路:
方法:快慢指针
图解:
示例:head=[1,2,3,4,5],k=2;
步骤:
具体操作:
- 首先我们判断链表是否为空,为空则返回head,不为空进行下面的操作;
- 定义一个快指针 fast,一个慢指针 slow;
ListNode* fast=head; ListNode* slow=head;
- 让快指针(fast)先走 k 步;
for(int i=0;i>k;i++){ fast=fast->next; }
- 此时我们要考虑 k 是否大于链表长度如果小于链表长度:k 小于链表长度,上一步 for 循环中就是 k ;k 大于链表长度,上一步 for 循环中的 k 就要进行计算。
- 根据规律我们发现,可以让 k=k%链表长度,这样的话两钟情况都满足。我们通过一个新的函数去计算数组长度;
int fun(LinsNode* head){ int len=0; while(head){ head=head->next; len++; } return len; }
- 之后我们令 k=k%len在执行 for 循环;
- 此时快(fast)慢(slow)指针之间便相差了 k 位,再让他们一起移动,当 fast->next == nullptr 时结束循环;
while(fast->next){ fast=fast->next; slow=slow->next; }
- 快指针(fast)到链表尾部,然后下一个结点指向头结点;新的头结点指向 slow;slow 指空,变成尾部
fast->next=head; head=slow->next; slow->next=-nullptr;
具体代码:
class Solution {
public:
//先考虑k是否大于链表长度
int fun(ListNode* head){
int len=0;
while(head){
head=head->next;
len++;
}
return len;
}
ListNode* rotateRight(ListNode* head, int k) {
if(head==nullptr)return head;
//计算节点数
int len=fun(head);
k = k % len;
//快慢指针
ListNode* fast=head;
ListNode* slow=head;
//快指针先走k步
for(int i=0;i<k;i++){
fast=fast->next;
}
//快慢指针同时移动,直到fast->next==nullptr
while(fast->next){
fast=fast->next;
slow=slow->next;
}
//快指针到链表尾部,然后下一个结点指向头结点
fast->next=head;
//新的头结点指向slow
head=slow->next;
//slow指针指空,变成尾部
slow->next=nullptr;
return head;
}
};