文章目录
- [1. 题目介绍](#1. 题目介绍)
- [2. 思路分析------快慢指针](#2. 思路分析——快慢指针)
- [3. 代码实现](#3. 代码实现)
1. 题目介绍
链接: link
给我们一个单链表,返回其中倒数第K个结点的值。
2. 思路分析------快慢指针
思路:快慢指针。
定义两个指针fast和slow。快指针fast先走K步,然后fast和slow同时走。当fast走到NULL的时候,slow就处在倒数第K个结点的位置。
可以画个图带大家看一下:
比如这个链表
现在我们要返回倒数第3(K=3)个结点,即4。
我们来分析一下
当然还有另外一种走法:先让fast走K-1步,然后两者同步走,这样的话就是fast走到最后一个结点的时候(fast->next==NULL)结束。
两种方法都差不多,我们来写一下代码
3. 代码实现
fast先走K步:
🆗,通过了
cpp
int kthToLast(struct ListNode* head, int k){
struct ListNode* slow=head;
struct ListNode* fast=head;
while(k--)
{
fast=fast->next;
}
while(fast)
{
fast=fast->next;
slow=slow->next;
}
return slow->val;
}
如果fast先走K-1步:
注意先走K步,第二个while循环结束的条件就是fast->next==NULL
也是可以通过的。
cpp
int kthToLast(struct ListNode* head, int k){
struct ListNode* slow=head;
struct ListNode* fast=head;
while(--k)
{
fast=fast->next;
}
while(fast->next)
{
fast=fast->next;
slow=slow->next;
}
return slow->val;
}
当然还想给大家提一点就是:
这道题题目中已经明确指出给定的 k 保证是有效的。
如果题目没有这样说的话,那么就需要考虑K可能大于链表的长度,但对于这种情况我们要进行一个判断。
因为如果K大于链表长度
那第一个循环中fast就会走到NULL,你再去访问它的next,那就是对空指针解引用了,程序就会出错了。