题目
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
if(head==nullptr){
return head;
}
ListNode* slow=head;
ListNode* fast=head;
for(int i=1;i<=k;i++){
}
}
};
思路:
我一开始的思路是遍历所有的节点,得到链表的长度n;
然后对每个节点计算一个右移之后的位置
参考大佬的思路:
特殊情况 没有一个节点 或者 只有一个节点 直接返回head
1、先求链表的总节点数n
2、k对n取余数
之后k==0 直接return 因为和原来没有变化
3、连接
newhead=slow->next
fast->next=head
slow->next=nullptr
ListNode* rotateRight(ListNode* head, int k) {
if(head== nullptr || head->next ==nullptr){
return head;
}
int n=0;
//求出链表总共的节点数
ListNode* tmp=head;
while(tmp!= nullptr){
n++;
tmp=tmp->next;
}
k=k%n; //模n之后得到k 链表从后往前第k个
//注意此时要返回
if(k==0){
return head;
}
//快慢指针
ListNode* slow=head;
ListNode* fast=head;
for(int i=0;i<k;i++){
fast=fast->next; //fast移动k步
}
while(fast->next!= nullptr){
slow=slow->next;
fast=fast->next;
}
//此时slow指向的是倒数第k+1个节点
ListNode* newHead=slow->next;
fast->next=head;
slow->next= nullptr;
return newHead;
}