[LeetCode]链表中倒数第k个结点

在这里插入图片描述

[LeetCode]链表中倒数第k个结点


题目

输入一个链表,输出该链表中倒数第k个结点。

在这里插入图片描述

链接:https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&&tqId=11167&rp=2&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking


分析

在这里插入图片描述

我们在解决这道题目之前,我们先回顾一下双指针思路的讲解https://blog.csdn.net/weixin_52664715/article/details/120746151?spm=1001.2014.3001.5501

我们在学习了双指针的解决思路之后,我们面对这一类型的题目首选任然是双指针方法去解决,那么我们应该怎样使用该方法去解决呢?

我们分析题目知道,题目要求我们找到倒数第k个结点,那么我们的首要问题就是这么去找到这个位置,我们任然举例追击相遇的问题,在桥上,有两辆相同的自行车,两车的移动速度相同,但我们让一辆自行车先向前移动3m,那么我们现在再让两车同时出发,那么最终的结果是出发距离提前的自行出先到达,同时后面的自行车与已经到达的自行车之间的距离仍为3m

那么我们在解决这道问题也是相同的,我们仍然设置两个指针,一个快指针fast,一个慢指针slow,但这一次我们不再是让快指针每一次移动k个距离单位,而是让我们的快指针先移动k个单位距离之后,快慢指针一起移动

此时我们遍历我们的链表,直至fast指针先移出链表范围,此时我们的slow指针指向的位置就是我们链表中倒数的k个结点

但是我们仍要考虑一些特殊情况,当我们让fast指针先移动时,如果我们的要查找倒数第9个数,可是我们的链表中只含有3个元素时,我们是没有这个元素的,那么我们就要增加判断代码


代码

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{
	ListNoed* fast,*slow;
	fast = slow = pListHead;

	while(k--)//我们先让fast指针向前移动
	{
		if(fast = NULL)//判断如果我们当前fast指针指向为NULL,那么我们就返回,查找不到;这里就解决了我们上面提到的链表中只含有3个元素,但我们却要找倒数第9个元素,当fast移动4个单位距离时,fast指针指向的就是NULL,此时我们结束,返回NULL
			return NULL;
		fast = fast->next;
	}

	while(fast)
	{
		fast = fast->next;
		slow = slow->next;
	}

	return slow;
}

总结

快慢指针在我们数据结构中的链表问题经常使用,也是十分经典的解决方法,我们这里就不在是简单的双指针的直接应用,多了一些分析,在后面的问题中会经常使用,在后面我也会继续分析与记录
以上就是我对这种方法的个人理解

上述内容如果有错误的地方,还麻烦各位大佬指教【膜拜各位了】【膜拜各位了】
在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr、Jerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值