链表OJ题【环形链表】(3)

目录

环形问题的思考

❓Q1

❓Q2

🙂Q2 

❓Q3

❓Q4

8.环形链表

9.环形链表Ⅱ


今天接着链表的经典问题环形问题。大家一定要自己动手多写写。🙂

  • 快慢指针(保持相对距离/保持相对速度)
  • 野指针
  • 考虑为NULL的情况
  • 带环链表:尾节点的next指向链表中的任意点(甚至可能指向它自己)
  • 循环条件
  • 结论

环形问题的思考

假设现有一个链表是带环的,请你做出如下思考和证明! (环形链表如下)

❓Q1

slow一次走1步,fast一次走2步,他们一定会相遇吗?(slow在走满一圈之前)

假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。当慢指针刚进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。此时,两个指针每移动一次,之间距离缩小一步,不会出现每次刚好是套圈的情况。

  • 因此:在满指针走到一圈之前,快指针肯定是可以追上慢指针的,即相遇  

❓Q2

slow一次走1步,fast一次走3步,他们一定会相遇吗?

  • 如果N是偶数第一圈就直接追上了。
  • 如果N是奇数,C是奇数,C-1是偶数,第二圈也追上了。
  • 如果N是奇数,C是偶数,C-1是奇数,永远追不上。
  • N是slow开始入环,fast的最初开始追击的距离。
  • C是环的长度。 

🙂Q2 

在上面的基础上,请问N是奇数,C是偶数,C-1是奇数这个条件是否成立。请证明! 

  • 起点到入环的距离:L
  • N是slow开始入环,fast的最初开始追击的距离。
  • 环的长度:C
  • slow每次走1步
  • fast每次走3步
  • 关键点:从开始位置到slow入环的路程,速度是3倍关系,同一时间段,路程是3倍的关系。
  • 结论:N是奇数,C是偶数,C-1是奇数这个条件不成立。 

❓Q3

slow一次走n步,fast一次走m步,他们一定会相遇吗?(m>n>1)

  • 如果  N%(m-n) == 0 第一圈就直接追上了。
  • 如果  N%(m-n) == x 第一圈也追不上了。
  • 如果  (C-x)%(m-n) == 0 第二圈就追上了。
  • 如果  (C-x)%(m-n)  != 0   永远追不上了。
  • N是slow开始入环,fast的最初开始追击的距离。
  • C是环的长度。 

❓Q4

请证明:

让一个指针slow链表起始位置开始遍历链表,同时让一个指针fast判环时相遇点的位置开始绕环运行,注意slow每次走1步,fast每次走1步,最终肯定会在入口点的位置相遇。

  •  起点到入环的距离:L
  • 入口点到相遇点:X
  • 环的长度:C
  • slow每次走1步
  • fast每次走2步
  • 关键点:从起始点到相遇点路程。速度是二倍关系。同一时间段,路程也是2倍的关系。
  • 结论:一个指针从相遇点开始走,一个指正从头开始走,他们会在入口点相遇

8.环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。 

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

【快慢双指针】

思路:快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表其实位置开始运行,
如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。 

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
bool hasCycle(struct ListNode *head) 
{struct ListNode *faster=head;struct ListNode *slow=head;//一起走faster走2步 slow走1步--保持相对速度while(faster && slow && faster->next){faster=faster->next->next;slow=slow->next;if(slow == faster){return true;}}return false;
}

//另外写法

bool hasCycle(struct ListNode *head) 
{struct ListNode *faster=head;struct ListNode *slow=NULL;if(head == NULL){return false;}while(faster != slow){if(slow == NULL){slow=head;}if(faster == NULL || faster->next == NULL){return false;}faster=faster->next->next;slow=slow->next;}return true; 
}

 

9.环形链表Ⅱ

 给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

【快慢指针】

  • 找到相遇的地方
  • 让一个指针slow链表起始位置开始遍历链表,同时让一个指针fast判环时相遇点的位置开始绕环运行,注意slow每次走1步,fast每次也走1步,最终会在入口点的位置相遇。(结论)
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode *detectCycle(struct ListNode *head) 
{struct ListNode *slow=head;struct ListNode *fast=head;struct ListNode *meet=NULL;while(fast && fast->next){fast=fast->next->next;slow=slow->next;if(fast == slow){slow=head;while(fast != slow){slow=slow->next;fast=fast->next;}return fast;}}return NULL;
}


 【链表的相交】

感谢各位!下篇我们开始双向链表的学习。一起加油💪小伙伴们! 

【链表练习题】链表知识点题库 - 力扣(LeetCode)

 牛客网在线编程_算法篇_面试必刷TOP101 (nowcoder.com)

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/169426.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(离散数学)逻辑连接词

异或可以理解为不同为1相同为0 P->Q的前件和后件满足0->1的其中一个就为真 <—>可以看做 &#xff0c;相同为1不同为0 异或与等价相反

Radius是什么意思? 安当加密

Radius是什么意思&#xff1f; RADIUS&#xff08;Remote Authentication Dial In User Service&#xff09;是一种远程用户拨号认证系统&#xff0c;它由RFC 2865和RFC 2866定义&#xff0c;是应用最广泛的AAA&#xff08;Authentication、Authorization、Accounting&#xf…

在任何机器人上实施 ROS 导航堆栈的指南

文章目录 路径规划参考 路径规划 路径规划是导航的最终目标。这允许用户向机器人给出目标姿势&#xff0c;并让它在给定的环境中自主地从当前位置导航到目标位置。这是我们迄今为止所做的一切&#xff08;地图绘制和本地化&#xff09;的汇集点。ROS 导航堆栈已经为我们完成了…

No183.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

docker下的nginx代理转发到tomcat

多次尝试失败原因&#xff0c;修改nginx配置文件以后&#xff0c;需要./nginx.sh -s reload 下&#xff0c;之前一直不转发&#xff0c;好像完全没有跳转的意思&#xff0c;后来查了多篇文档&#xff0c;最简单的方法如下 docker 安装 nginx 和tomcat就不多说了&#xff0c;可…

Revit 平面的圆弧,空间的椭圆弧

大家对Revit的空间曲线那么理解,如何用代码创建空间的椭圆弧,,上看是圆弧,正面看是椭圆? 直接放代码: Document doc = commandData.Application.ActiveUIDocument.Document; Autodesk.Revit.DB.XYZ center = new Autodesk.Revit.DB.XYZ(0, 0, 0); …

LCD1602设计(1)

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

基于SSM的微博网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

STM32-HAL库09-CAN通讯(loopback模式)

一、所用材料&#xff1a; STM32F103C6T6最小系统板 STM32CUBEMX&#xff08;HAL库软件&#xff09; MDK5 串口调试助手 二、所学内容&#xff1a; 初步学习如何使用STM32的CAN通讯功能&#xff0c;在本章节主要达到板内CAN通讯的效果&#xff0c;即32发送CAN信息再在CAN接收…

一个java文件的JVM之旅

准备 我是小C同学编写得一个java文件&#xff0c;如何实现我的功能呢&#xff1f;需要去JVM(Java Virtual Machine)这个地方旅行。 变身 我高高兴兴的来到JVM&#xff0c;想要开始JVM之旅&#xff0c;它确说&#xff1a;“现在的我还不能进去&#xff0c;需要做一次转换&#x…

2023年11月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年11月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

jQuery HTML/CSS 参考文档

jQuery HTML/CSS 参考文档 文章目录 应用样式 示例属性方法示例 jQuery HTML/CSS 参考文档 应用样式 addClass( classes ) 方法可用于将定义好的样式表应用于所有匹配的元素上。可以通过空格分隔指定多个类。 示例 以下是一个简单示例&#xff0c;设置了para标签 <p&g…