带环链表问题

带环链表就是字面意思带环的链表,例如以下这三种情况

 练习题

1.给定一个链表,判断链表中是否带环. - 力扣(LeetCode)

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

 

 

 当slow指针进环时,fast和slow追及(一定能追上),证明过程如下

 证明:假设slow进环时,与fast指针相距N,快慢指针的速度差为1,所以快慢指针之间的距离变化为

N->N-1->N-2->N-3->........->2->1->0,每追击一次,距离减小1,当减小为0时,就是追上了,这里最差的情况就是两个指针之间的距离刚好就是环的长度。

 所以,在慢指针走一圈之前,快指针肯定是可以追上慢指针的

问题扩展:

1.快指针走一次走3步,4步,n步可以吗?

当快指针走3步时,两指针之间的距离变化为

偶数              奇数

N                   N

N-2                N-2

N-4                N-4

...                     ...

4                        3

2                         1

0(追上了)            -1(错过了进行新一轮的追击),快慢指针之间的距离变为C-1(C为环的长度),这里又有两种情况,C-1分为奇数和偶数

总结:

1.N是偶数,第一轮就追上了

2.N是奇数,第一轮就会错过,距离变为C-1

   a.如果c-1是偶数,下一轮就追上

   b.如果c-1是奇数,就永远也追不上了

所以,如果同时存在N是奇数和C是偶数,就永远追不上(实际上这种情况并不存在)

证明:假设slow进环时,fast和slow之间的距离为N,此时fast已在环里走了x圈,slow走的距离为L,fast走L+x*C+C-N,fast走的距离是slow的3倍

3*L=L+x*C+C-N

2*L=(x+1)*C-N,如果同时存在N是奇数和C是偶数,这个等式就不成立,C和N只能同时为奇数或者偶数

结论:一定能追上,N为偶数第一轮就追上,N为奇数第一轮追不上,但C-1为偶数第二轮就可以追上。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {ListNode*slow=head;ListNode*fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(fast==slow)return true;}return false;
}

2.给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。. - 力扣(LeetCode)

结论:相遇后,slow指针指针继续走,cur指针起始位置开始走,相遇的位置就是入环的第一个节点

证明:slow指针走过的距离L+N,fast走的为L+N+C*x,fast走过的距离是slow的2倍

2*(L+N)=L+N+C*x

L=C*x-N=(x-1)*C+(C-N)x>=1

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {ListNode*slow=head;ListNode*fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){ListNode*meet=slow;while(meet!=head){head=head->next;meet=meet->next;}return meet;}}return NULL;
}

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

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

相关文章

【项目经验】Redis Sentinel从工程中下线并对业务迁移-(二)

在上篇文章【项目经验】Redis Sentinel从工程中下线并对业务迁移-进行中-CSDN博客有说到迁移的计划。最近一直按照计划进行迁移,期间遇到了不少问题。总结如下: 一、key未设置过期时间 redis基于内存存储,主要作用是缓存。当大量的key未设置…

nginx的前世今生(二)

书接上回: 上回书说到,nginx的前世今生,这回我们继续说 3.缓冲秘籍,洪流控水 Nginx的缓冲区是其处理数据传输和提高性能的关键设计之一,主要用于暂存和管理进出的数据流,以应对不同组件间速度不匹配的问题…

池化整合多元数据库,zData X 一体机助力证券公司IT基础架构革新

引言 近期,云和恩墨 zData X 多元数据库一体机(以下简称 zData X)在某证券公司的OA、短信和CRM业务系统中成功上线,标志着其IT基础架构完成从集中式存储向池化高性能分布式存储的转变。zData X 成功整合了该证券公司使用的达梦、O…

Windows php 安装 Memcached扩展、php缺失 Memcached扩展、Class ‘Memcached‘ not found

在Windows系统下如何安装 php Memcached 扩展 下载dll文件 pecl地址:https://pecl.php.net/package/memcached 根据版本进行选择 : 解压下载的文件后得到了这么样的文件结构: 配置 移动dll文件到相应文件位置 重点: libme…

FreeRTOS队列集(1-15)

队列集定义:def 队列集只允许任务间传递消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,就可以使用队列集。 用于对多个信号量进行监听,其中不管哪一个消息到来,都可以让任务退出阻塞状态 假设&am…

如何利用MCU自动测量单元提高大坝安全监测效率

大坝作为重要的水利基础设施,其安全性直接关系到人民群众的生命财产安全和社会的稳定发展。因此,对大坝进行实时、准确的安全监测至关重要。近年来,随着微控制器单元(MCU)技术的不断发展,其在大坝安全监测领域的应用也越来越广泛。…

springboot配置WebMvcConfigurationSupport

一、在spring里有四个mvc配置类 1、mvc配置类 WebMvcConfigurer WebMvcConfigurerAdapter WebMvcConfigurationSupport WebMvcAutoConfiguration 2、WebMvcConfigurer为接口 3、WebMvcConfigurerAdapter是WebMvcConfigurer的实现类,且大部分为空方法,…

微服务架构面试题(二)

1. 请简述微服务中各组件的作用 ? 微服务架构中的组件各自扮演着关键的角色,它们协同工作以构建高效、可扩展和灵活的系统。以下是一些核心组件及其作用: 服务注册与发现组件:如Eureka,负责让其他服务知道当前服务的…

使用 Flask、Gunicorn 与 Shell 脚本构建高效 Web 应用部署流程

在使用 Flask 作为 Web 应用框架,并使用 Gunicorn 作为 WSGI 容器,使用shell 脚本来管理应用的启动、重启和停止。 启动脚本 start.sh: #!/bin/bash# 设置应用名称和端口 APP_NAME"my_flask_app" PORT8000# 设置 Flask 应用的路径…

【PCL】教程 supervoxel_clustering执行超体聚类并可视化点云数据及其聚类结果

[done, 417.125 ms : 307200 points] Available dimensions: x y z rgba 源点云milk_cartoon_all_small_clorox.pcd > Loading point cloud... > Extracting supervoxels! Found 423 supervoxels > Getting supervoxel adjacency 这段代码主要是使用PCL(Po…

【Linux】创建/扩容swap交换空间swap优化

一、当前交换空间大小 目前交换空间大小为2G 二、创建swap交换空间 #创建大小为2G的交换空间 [roothadoop01 data1]# dd if/dev/zero of/data1/swapfile bs1M count2048 #将文件设置为交换空间 [roothadoop01 data1]# mkswap /data1/swapfile #启用交换空间 [roothadoop01 da…

【Python】pandas.cut()函数的用法

pandas.cut() 函数是一个非常有用的工具,用于将数值型数据按照指定的分箱或区间进行分割,从而将连续的数值变量转换为离散的类别变量。这在数据分析和机器学习的特征工程中尤其有用,因为它可以帮助揭示不同区间内的数据分布特征,或…

【Qt问题】Qt Creator 如何链接第三方库

往期回顾 【QT问题】 Qt信号函数如果重名,调用怎么处理-CSDN博客 【Qt问题】Qt中文乱码问题解决方案(详细汇总)-CSDN博客 【Qt问题】Qt常用快捷键汇总-CSDN博客 【Qt问题】Qt Creator 如何链接第三方库 一、为什么会使用第三方库 在编写代码…

Java Web 开发 - 掌握拦截器和监听器

目录 深入了解Java Web的拦截器和监听器 拦截器(Interceptor) 拦截器的使用场景 拦截器实例 思维导图 ​编辑 监听器(Listener) 监听器的使用场景 监听器类型 监听器实例 思维导图​编辑 总结 深入了解Java Web的拦截器…

在UI界面中播放视频_unity基础开发教程

在UI界面中播放视频_unity基础开发教程 前言操作步骤结语 前言 之前我写过一篇在场景中播放视频的文章,但是在开发中有时候也会在UI的界面中播放视频,这期我们做一下在UI的界面中播放视频。 操作步骤 首先在场景中创建一个Raw Image,UI->…

DAO是什么?有什么用途?

DAO(Decentralized Autonomous Organization,去中心化自治组织)是一种基于区块链技术的组织形式,它没有中央管理层,而是通过智能合约和区块链上的代码来运作。DAO 的决策过程是透明的,通常由组织的成员通过…

java学习笔记11

20. 字符串类 字符串是指一连串的字符,它是由许多单个字符连接而成。字符串可以包含任意字符,这些字符必须包含在一对双引号""之内,例如:“abc”.java中封装了3个字符串类,分别是String类、StringBuffer类、StringBuilder类,都在java.lang包中。20.1 String类的…

孤独的城市公路(增加开始结束页面)

致敬 裴总 缺点 没有一个车没有背景音乐后期都会添加 为什么裴总良心 裴总真良心 还有音乐 还是3D 还有开始按钮 还能game 还有结尾 还有结尾提示 import arcadeSCREEN_WIDTH 700 SCREEN_HEIGHT 700 SCREEN_TITLE "孤独的城市公路" MOVEMENT_SPEED 5 …

go http框架下的静态资源代理实现(压缩,缓存验证自定义)

之前在这一篇文章里说了我的第一版静态资源代理,后面我又完善了一下: 上一种方案的问题: 首页未加入自定义代理中依赖了gin框架的file()方法反复访问本地文件,访问文件系统是很消耗性能的 所以本次我做了改进,思路是…

0418EmpTomCat项目 初次使用ajax实现局部动态离职

0418EmpTomCat项目包-CSDN博客 数据库字段: 员工部门表 分页查询; 多条件查询; 添加新员工; ajax点击离职操作效果: