判断链表是否有环,如果有返回环的入口,即链表有环证明,和找到环的入口证明(非常清晰的证明过程)

news2024/11/23 4:11:51

有环链表

判断一个链表有环,如果有环,返回起点

使用快慢指针的方式,两个指针同时指向头节点,慢指针low一次走一步,快指针fast一次走两步,只要low和fast相遇即说明链表有环

只要快指针和慢指针有相差的步数,但最好是差一步,fast就可以追上low,不一定是low1步,fast2步

img

如果链表有环,此时fast指针比low指针多走了一倍的路程,此时fast重新指向头节点,low和fast都每次向下走一步,low和fast再次相遇的节点,就是环的入口 为什么?

img

证明:以下图为例,设在入口前的长度为preLen low与fast 的碰撞点位置为impact 入口位置到碰撞点位置的长度为 impPreLen 从碰撞点到入口的距离为 impProLen ,环的长度为 ringLen, 同时意味着 ringLen = impPreLen + impProLen => impPreLen = ringLen - impProLen

  1. 以fast指针走两步,low指针走一步证明
  2. 设 : fast指针一共走了 fastN 步, low指针走了lowM步 ,并且fastN = 2lowN
  3. 设:fast指针在环中走了fastRing圈,low指针走了lowRing圈(没到一整圈不算)
  4. 此时fastN = preLen + fastRing * ringLen + impPreLen (入口前长度 + 走的圈数 + 最后入口到碰撞点长度)
  5. lowN = preLen + lowRing * ringLen + impPreLen

可以推理出

  1. preLen + fastRing * ringLen + impPreLen = 2 * (preLen + lowRing * ringLen + impPreLen)
  2. fastRing * ringLen = preLen + 2 * lowRing * ringLen + impPreLen
  3. preLen = (fastRing - 2lowRing) * ringLen - impPreLen
  4. impPreLen = ringLen - impProLen 带入公式
  5. preLen = (fastRing - 2lowRing) * ringLen - ringLen + impProLen
  6. preLen = (fastRing - 2lowRing - 1) * ringLen + impProLen

根据推理公式可以看出preLen 的长度 = 碰撞点 + n(fastRing - 2lowRing - 1)个环完整圈数

同时 碰撞点出发走n(fastRing - 2lowRing - 1)个环完整圈数 在走一个 impProLen 长度,是正好到达环入口点的

所以最后 fast恢复到 1 步 是走 preLen 长度到入口点是,一定可以和 low指针相碰

img

public static Node isHasRollLinkedList(Node node) {

    if (node == null || node.next == null || node.next.next == null) {
        return null;
    }

    Node fast = node.next;
    Node low = node.next.next;
    while (fast != low) {
        if (fast.next == null || fast.next.next == null) {
            return null;
        }
        fast = fast.next.next;
        low = low.next;
    }

    fast = node;
    while (fast != low) {
        fast = fast.next;
        low = low.next;
    }
    return low;
}

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

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

相关文章

Maven Javafx javafx-maven-plugin打包项目,添加dll文件

在pom.xml的 javafx-maven-plugin内添加 additionalAppResources&#xff0c;并进行重新加载 <plugin><groupId>com.zenjava</groupId><artifactId>javafx-maven-plugin</artifactId><version>8.8.3</version><configuration&g…

2022,软件测试真的有说的这么容易吗?

前言 大家都说软件测试入门容易&#xff0c;似乎软件测试成了跳进互联网生态圈的最佳途径。但是不少小伙伴在入门软件测试后&#xff0c;却变的相当的迷茫&#xff0c;不知道自己应该做什么&#xff0c;似乎点点点就成了工作中唯一的事情了。趁现在负能量还没有缠身的时候&…

服务优化实践

性能分析常用方法 1. top top指令默认用来监控cpu使用情况&#xff0c;根据cpu使用情况&#xff0c;分析整个系统运作情况&#xff08;大多数系统cpu密集型&#xff09;top指令查询的进程&#xff0c;将会根据cpu使用率大小进行排序&#xff0c;使用的比较多的排在前面&#x…

重生强化【Reincarnating RL】论文梳理

重生强化【Reincarnating RL】论文梳理 文章目录重生强化【Reincarnating RL】论文梳理前言&#xff1a;文章链接&#xff1a;作者团队介绍&#xff1a;沈向洋老师的论文十问&#xff1a;联系方式&#xff1a;前言&#xff1a; 好久没写文章速读了&#xff0c;最近群友推荐了两…

html5期末大作业:自适应网站开发——公司网站7页 ,响应式页面

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

这10张图拿去,别再说学不会RecyclerView的缓存复用机制了

ViewPager2是在RecyclerView的基础上构建而成的&#xff0c;意味着其可以复用RecyclerView对象的绝大部分特性&#xff0c;比如缓存复用机制等。 作为ViewPager2系列的第一篇&#xff0c;本篇的主要目的是快速普及必要的前置知识&#xff0c;而内容的核心&#xff0c;正是前面…

SQL概述以及MySQL常用语句总结

目录数据库概述SQL与NoSQL对比关系型数据库管理系统的常用实例MySQL介绍安装数据库的连接SQLDDLDMLDQL单表查询多表查询多表关系连接查询连接分类内连接 JOIN外连接左外连接 LEFT JOIN右外连接 RIGHT JOIN自连接 JOIN联合查询 UNION子查询标量子查询列子查询行子查询表子查询DC…

大二Web课程设计——家乡主题网页设计(web前端网页制作课作业) 四川旅游网页设计制作

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

【Spring】——12、BeanPostProcessor的执行流程?(源码分析)

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

[附源码]Python计算机毕业设计房屋租赁管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

MongoDB Node 驱动使用指南

MongoDB Node 驱动介绍 1. MongoDB数据库连接指南 使用原生的mongodb Node驱动连接MongoDB数据库。 1.1 数据库连接URI 数据库连接URI是一个指明了数据库地址、名称、用户名、密码的字符串&#xff0c;类似于网页链接。 1.2 Node驱动安装 使用Npm或者Yarn安装数据库驱动程…

40_CAN通信基础知识

目录 CAN协议简介 CAN物理层 闭环总线网络 闭环总线网络 开环总线网络 通讯节点 差分信号 CAN协议中的差分信号 CAN协议层 CAN的波特率及位同步 位时序分解 SS段(SYNC SEG) PTS段(PROP SEG) PBS1段(PHASE SEG1) PBS2段(PHASE SEG2) 通讯的波特率 CAN的报文种类…

和数链技术与供应链金融的革命性融合发展

区块链是由密码技术、共识机制、点对点通信协议、分布式存储等多种核心技术体系高度融合&#xff0c;形成的一种分布式基础架构与计算范式&#xff0c;其本质则是一套去中心化的记账系统。区块链技术凭借自身分布式共享账本、去中心化、透明性、隐私保护、节点控制、信息的不可…

[附源码]计算机毕业设计的剧本杀管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

java+mysql基于ssm的校园快递代领系统

当代大学生的课业都比较繁重,很多学子甚至选修了双学位,但是为了保障生活的质量难免会在网上购买一些生活和学习用品,但是又因为学业或者兼职等原因不能按时的领取属于自己的快递,这个时候一个新兴的行业校园快递代领服务诞生了 本系统是一个校园快递代领系统,服务人员可以在线…

【Git】常用命令详解(循序渐进,逐步分析)

目录 一、Git常用命令 1.1、设置用户签名 1.2、初始化本地库 1.3查看本地库状态 1.3、添加文件到暂存区 1.4、将暂存区文件添加文件到本地库 1.5、查看历史版本&#xff08;提交历史记录&#xff09; 1.6、修改文件 1.7、版本穿梭 一、Git常用命令 1.1、设置用户签名…

前端浏览器支持的JS文件操作技术介绍

前端浏览器支持的JS文件操作技术介绍 本文将介绍前端浏览器支持的JS文件操作技术。通过使用在 HTML5 中加入到 DOM 的 File API&#xff0c;使在 web 内容中让用户选择本地文件然后读取这些文件的内容成为可能。用户可以通过 HTML 中的 <input type"file"> 元…

Python动态可视化Plotly

✨ 介绍 Plotly Express ✨&#xff1a; 提示&#xff1a;这里可以添加学习目标 Plotly Express是一个新的高级 Python 可视化库&#xff1a;它是Plotly.py的包装器&#xff0c;为复杂图表提供了简单的语法。受 Seaborn 和 ggplot2 的启发&#xff0c;它专门设计为具有简洁、…

【Meetup 明天见】OpenMLDB + MaxCompute:集成打通云上生态,高效构建 AI 应用

明天上午10&#xff1a;00-12:00&#xff0c;OpenMLDB 第八期 Meetup 将全程线上直播&#xff0c;欢迎关注。 活动背景 数据的爆发式增长为 AI 应用的繁荣提供了坚实的基础&#xff0c;而云服务作为新一代快速整合、高效计算的服务模式&#xff0c;为大数据的分析处理和 AI 智…

MySQL中SQL的执行流程

1 查询缓存 Server 如果在查询缓存中发现了这条 SQL 语句&#xff0c;就会直接将结果返回给客户端&#xff1b;如果没有&#xff0c;就进入到解析器阶段。需要说明的是&#xff0c;因为查询缓存往往效率不高&#xff0c;所以在 MySQL8.0 之后就抛弃了这个功能。 大多数情况查询…