题目
知识点
快慢指针:就是一个指针走的快,一个指针走的慢。(可以利用求中间结点,倒数第k个结点。)让两个指针开始都只想头结点,如果slow指针一次走一步,fast指针一次走两步,那么fast指针的移动速度就是slow的两倍。
思路
若有N个结点,要求倒数第K个结点,那么,即就是第N-K+1个结点。
fast先走K步,s若fast结点不为空,那么slow,fast同时一步一步走,知道fast为空,slow所指向的就是倒数第k个结点。
例如:[1,2,3,4,5]的倒数第二个
注意:
还需要考虑极端情况:
1.当链表为空,返回值为空;
2.当k小于等于零不符合常理,当k大于n,超出了链表长度。也返回空。
代码
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
struct ListNode* fast=pListHead;
struct ListNode* slow=pListHead;
//fast先走k步
//k<=0不会进入循环
while(k--)
{
//如果没有走到头
if(fast)
{
fast=fast->next;
}
//如果走到了头,说明K超过了链表长度
//当链表为空的情况也会在此处判断出来
else
{
return NULL;
}
}
//fast没有走到头
//两个一起走,直到fast为空,slow指向倒数第K个结点
while(fast)
{
slow=slow->next;
fast=fast->next;
}
return slow;
}