【牛客面试必刷TOP101】Day2.BM6 判断链表中是否有环和BM8 链表中倒数最后k个结点

作者简介:大家好,我是未央;

博客首页:未央.303

系列专栏:牛客面试必刷TOP101

每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!!

文章目录

文章目录

前言

一.判断链表中是否有环

题目描述

 解题分析

二.链表中倒数最后k个结点

题目描述

 解题分析

总结



前言

今天是算法题第2天,今天的题我们主要学会了掌握双指针的有关题型(快慢指针);


一.判断链表中是否有环

题目描述

描述

判断给定的链表中是否有环。如果有环则返回true,否则返回false。

数据范围:链表长度 0≤n≤10000,链表中任意节点的值满足 ∣val∣<=100000;

要求:空间复杂度 O(1),时间复杂度 O(n)。


输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。


举例说明:

例如输入{3,2,0,-4},1时,对应的链表结构如下图所示:

可以看出环的入口结点为从头结点开始的第1个结点(注:头结点为第0个结点),所以输出true。 


示例1:


示例2:


示例3:


 解题分析

解题思路:

本题我们采用双指针方法进行解析题目;

我们使用两个指针,fast 与 slow。

它们起始都位于链表的头部。随后,slow 指针每次向后移动一个位置,而fast 指针向后移动两个位置。

如链表中存在环,则 fast 指针最终将再次与 slow 指针在环中相遇;否则无法相遇没有环;


图示解析:


代码编写思路步骤:

步骤1.  初始化两个指针,一个称为“快指针”(fast)和一个称为“慢指针”(slow),并将它们都指向链表的头节点。


步骤2.  在循环中,快指针每次移动两步,慢指针每次移动一步。这样,快指针将比慢指针走得更远。


步骤3.  如果链表中存在环,快指针最终会追上或与慢指针相遇。如果不存在环,快指针将会先到达链表的末尾,完成循环。如果快指针到了链表末尾,说明没有环,因为它每次走两步,所以要验证连续两步是否为NULL。


步骤4.  当快指针与慢指针相遇时,说明链表中存在环,可以返回 true。如果快指针达到链表的末尾而没有与慢指针相遇,则说明链表中没有环,可以返回 false。


图示过程分析:

代码编写:

二.链表中倒数最后k个结点

题目描述

描述

输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。

如果该链表长度小于k,请返回一个长度为 0 的链表。


数据范围:0≤1050≤n≤105,0≤090≤ai​≤109,0≤090≤k≤109;

要求:空间复杂度 O(n),时间复杂度O(n)。

进阶:空间复杂度 O(1),时间复杂度O(n)。


举例说明:
例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:

 其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。

示例1:


示例2:


 解题分析

解题思路:

本题我们采用快慢指针的方法进行解决;
第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针同时移动,当第一个指针到链表的末尾的时候,返回第二个指针即可;此时第二个指针所在的位置就是返回的倒数第k个结点;


图示解析:


代码编写思路步骤:

步骤1.  初始化两个指针,一个称为“快指针”(fast)和一个称为“慢指针”(slow),并将它们都指向链表的头节点。


步骤2.  将快指针先向前移动k个节点,使得快指针与慢指针之间相差k个节点。


步骤3.  然后,同时移动快慢指针,直到快指针到达链表的末尾。在这个过程中,快慢指针之间始终保持k个节点的距离。


步骤4.  当快指针到达链表末尾时,慢指针指向的节点就是倒数第k个节点。


注意:如果链表的长度小于k,即快指针到达末尾之前链表已经结束,这时就无法找到倒数第k个节点。


代码编写:

总结

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值