链表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.mzph.cn/news/139606.shtml

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

相关文章

SpringBoot自动装配定义先后顺序失效原因极其解析

SpringBoot自动装配定义先后顺序失效原因极其解析 1、场景分析1.1、问题总结 2、使用AutoConfigureBefore、AutoConfigureAfter和AutoConfigureOrder注解指定加载顺序2.2、AutoConfigureXX注解失效原因总结 3、使用静态内部装配类提升加载顺序4、bean加载顺序规则 1、场景分析 …

矩阵起源加入 OpenCloudOS 操作系统开源社区,完成技术兼容互认证

近日,超融合异构云原生数据库 MatrixOne企业版软件 V1.0 完成了与 OpenCloudOS 的相互兼容认证,测试期间,整体运行稳定,在功能、性能及兼容性方面表现良好。 一、产品简介 矩阵起源 MatrixOrigin 致力于建设开放的技术开源社区和…

Nginx缓存基础

1 nginx缓存的流程 客户端需要访问服务器的数据时,如果都直接向服务器发送请求,服务器接收过多的请求,压力会比较大,也比较耗时;而如果在nginx缓存一定的数据,使客户端向基于nginx的代理服务器发送请求&…

Spring面试题:(五)Spring注解开发@Component,@Autowired,@Bean,@Configuration

Bean基本注解 spring提供注解的版本 Component注解替代bean标签 bean其它属性的相关注解: scope 替代scopelazy 替代lazy-initPostConstruct 替代init-methodPreDestroy 替代destroy-method 使用Component注解的前提是开启注解扫描 衍生注解Repository,Servi…

jdk安装

.概览 1.jdk下载 JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。 安装JDK后,会在电脑中同时安装:java的运行环境jre 和 开发环境jdk。 安装 JDK时,不建议安装太旧或太新的版本。目前的最新版本是jdk9。目前jdk8比较稳定&am…

STM32 LED编程 GPIO的初始化(标准库)

实验的电路图介绍 实验的电路图类似于开漏接法 要初始化GPIOC接口 标准库的模板 GPIO的标准库编程接口 GPIO引脚的初始化 GPIO作为片上外设 每一个片上外设使用前一定要使能时钟 为什么要使能时钟?时钟是啥 时钟的使能 stm32的每一个片上外设都是时序电路 时序…

多数据源切换

多数据源切换 jdbcTemplate二级目录三级目录 jdbcTemplate使用切面mybatis层次的多数据源spring的dynamic自动注入 jdbcTemplate 二级目录 三级目录 项目中经常会有多个数据源,那么如何处理呢 有4种方法 准备: 创建两个数据库 CREATE SCHEMA test DE…

Django中如何创建表关系,请求生命周期流程图

Django中ORM创建表关系 如何创建表关系(一对一 , 一对多 , 多对多) 图书表,出版社表,作者表,作者详情表 换位思考法判断表关系 图书表和出版社表 >>> 一对多 >>> 图书表是多,出…

GCC工具详解【Linux知识贩卖机】

很多人在喧嚣声中登场,也有少数人在静默中退出。 --单独中的洞见2 文章目录 简介程序到可执行文件链接动态链接和静态链接动态库和静态库动态库和静态库的打包打包静态库打包动态库选项 -static 总结 简介 GCC(GNU Compiler Collection) 是一…

计算机中丢失mfc140u.dll怎么解决

mfc140u.dll是一个Microsoft Visual C库文件,主要用于MFC(Microsoft Foundation Class)应用程序的开发。它包含了MFC应用程序所需的一些常用功能,如对话框、窗口、菜单等。当mfc140u.dll丢失时,可能会导致MFC应用程序无…

思科9300交换机使用USB进行升级ISO

一、下载ISO 一、网址 Software Download - Cisco Systems 二、找到型号 四、选择XE 软件 五、进行下载 二、COPY 进 U盘 一、、请注意!如果你的U盘不是Fat32文件格式则交换机读取不了,请先格式化再复制文件。 二、下载后将 bin文件复制到U盘。 1.扩展…

idea Plugins 搜索不到插件

Settings — System Settings — HTTP Proxy,打开HTTP Proxy 页面,设置自动发现代理: 勾选Atuto-detect proxy settings,勾选Automatic proxy configuration URL,输入: https://plugins.jetbrains.com/id…

【Python】AppUI自动化—appium自动化元素定位、元素事件操作(17)下

文章目录 前言一.Appium 元素定位1.定位方式种类2.如何定位2.1 id定位2.2 className定位2.3 content-desc 定位2.4 Android Uiautomator定位4.1 text定位4.2 text模糊定位4.3 text正则匹配定位4.4 resourceId定位4.5 resourceId正则匹配定位4.6 className定位4.7 className正则…

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

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

适用于初学者的 .NET MAUI

适用于初学者的 .NET MAUI | Microsoft Learn 记录微软Learn中用到的代码。文章比较粗糙,大部分是项目代码粘贴。想详细学习的可到上面的链接学习,代码可以从这里复制后直接运行。 练习中一共有两个页面: 1、MainPage.xaml 用于添加列表中的…

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

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

【Unity实战】实现强大通用易扩展的对话系统(附项目源码)

文章目录 先看看实现的最终效果前言素材前期准备工作1. 简单绘制地形2. 绘制对话框3. 配置人物动画4. 实现简单的控制人物移动 控制对话框的显示隐藏定义对话内容实现简单的对话功能逐字打印效果按下按键快速显示文本实现多个NPC配置不同对话扩展TextAsset 读取文档文件实际应用…

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

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

Mac电脑配置Flutter开发环境

1.进入官网下载页: Flutter SDK releases | Flutter 可以看到有 Windows、macOS、Linux三种系统的下载包 选择macOS,然后点击下载 Stable channel(稳定版)中的最新版本,下载完成后可以移动到资源库Library中。 2.下载…

TCP触发海康扫码相机S52CN-IC-JQR-NNN25

PC环境设置 为保证客户端正常运行以及数据传输的稳定性,在使用客户端软件前,需要对 PC 环境 进行设置 关闭防火墙 操作步骤如下: 1. 打开系统防火墙。 2. 在自定义设置界面中,选择关闭防火墙的对应选项,并单击…