解法一:双指针
定义指针fast,slow,倒数多少个,fast就移动多少步,然后slow和fast一起移动,直到fast指向nullptr
/*
使用双指针法
*/
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode* fast=head;
ListNode* slow=head;
while(fast&&k>0){
fast=fast->next;
k--;
}
while(fast){
fast=fast->next;
slow=slow->next;
}
return slow;
}
};
解法二:递归方法
可以使用递归方法,也可以使用栈的数据结构
/*
使用递归方法
*/
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
if(head==nullptr) return nullptr;
ListNode* node=getKthFromEnd(head->next,k);
x++;
return x==k?head:node;
}
};
使用栈
/*
使用栈
*/
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
stack<ListNode*> res;
while(head){
res.push(head);
head=head->next;
}
while(k-1>0){
res.pop();
k--;
}
return res.top();
}
};