快慢指针法
快指针比慢指针快k步,当快指针为空时,慢指针刚好指向倒数第k个
- 快慢指针的思路来源于相对距离,倒数第k个->两个指针相差k步保持不变
判断长度是否符合要求,应该用k是否等于0而不是快指针为空,当第一个就是倒数第k个,快指针为空符合要求。
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
// write code here
ListNode* fast=pHead;
ListNode* slow=pHead;
while(fast&&k)
{
k--;
fast=fast->next;
}
if(k)
{
//k不为0
return nullptr;
}
while(fast&&slow)
{
slow=slow->next;
fast=fast->next;
}
return slow;
}
};
递归法
递归满足倒序遍历,倒序数到第k个。
- 递归终止条件空指针。
- 保证值在递归函数传递或者不受影响,有三种方式全局变量,返回值,引用。
- 这里k和k_node都不能受影响,一个作为返回值,一个作为全局变量。
- 返回result-1不受if影响,保证result改变,如果不变,则k_node会被每层函数的pHead赋值。
- k_node初始值为空,使得不符合条件时直接返回空。
class Solution {
public:
ListNode* k_node=nullptr;
int recrusion(ListNode* pHead,int k)
{
if(!pHead)
{
return k-1;
}
int result=recrusion(pHead->next, k);
if(result==0)
{
k_node=pHead;
}
return result-1;
}
ListNode* FindKthToTail(ListNode* pHead, int k) {
// write code here
int result=recrusion(pHead, k);
return k_node;
}
};
遍历法
遍历出长度,进行判断k是否合法,再求解出倒数第k个



京公网安备 11010502036488号