当前位置: 首页 > news >正文

链表中环的入口节点

链表中环的入口节点

描述

链表中环的入口节点
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。

数据范围: n≤10000, 1<=结点值<=10000
要求:空间复杂度 O(1),时间复杂度 O(n)

解法一

解法一:有环的链表,在遍历时会在环中一直循环,想要获得环的入口结点,
直观地想,可以使用hash法保存出现的结点,当重复环的遍历过程时,第一次碰到重复的结点即为环入口结点B。

解法二

解法二:通过定义slow和fast指针,slow每走一步,fast走两步,若是有环,则一定会在环的某个结点处相遇(slow == fast),
根据下图分析计算,C为fast和slow指针第一次相遇的点。可知从C到B与从A到B以相同速度走第一次相遇的节点一定为B,即为入口点。解法二的实现,如下。
在这里插入图片描述

代码实现

public class Node<V> {public Node<V> pre;public Node<V> next;private V v;public Node(V v) {this.v = v;}public V getV() {return v;}public void setV(V v) {this.v = v;}
}
public static Node<Integer> entryNodeOfLoop(Node<Integer> head) {if (head == null || head.next == null){return null;}Node<Integer> fast = head;Node<Integer> slow = head;while (fast !=null && fast.next !=null){fast = fast.next.next;slow = slow.next;if (slow == fast){break;}}// 若是快指针指向null,则不存在环if(fast == null || fast.next == null)return null;// 重新指向链表头部fast = head;while (fast !=slow){fast = fast.next;slow = slow.next;}return fast;
}

从C到B与从A到B以相同速度走第一次相遇的节点一定为B?

在这里插入图片描述
我们用数学的方式证明一下。

如果结论:A到B走和C到B顺时针相同速度走,第一次相遇的点一定为B点。成立
那么数学表达式有 X = n(Y+Z)+Z  n>=0,n为环的圈数;的结论成立为证明A到B走和C到B顺时针相同速度走,第一次相遇的点一定为B点
即证明:X = n(Y+Z)+Z  n>=0;n为环的圈数由第一次相遇在C点得:2(X+Y) = X + w(Y+Z) + Y;(w>=1,w为环的圈数)
推导:==>  2(X+Y) = X + w(Y+Z) + Y + Z + Y;(w>=0,w为环的圈数)==>  2(X+Y) = X + w(Y+Z) + 2Y + Z;(w>=0,w为环的圈数)==>          X  = w(Y+Z) +Z ;(w>=0,w为环的圈数)所以:X = n(Y+Z)+Z  n>=0;n为环的圈数。成立即:A到B走和C到B顺时针相同速度走,第一次相遇的点一定为B点。
http://www.lryc.cn/news/379701.html

相关文章:

  • STL——函数对象,谓词
  • 【区分vue2和vue3下的element UI Descriptions 描述列表组件,分别详细介绍属性,事件,方法如何使用,并举例】
  • atcoder abc 358
  • 手写docker:你先玩转namespace再来吧
  • 注册安全分析报告:PingPong
  • mysqladmin——MySQL Server管理程序(二)
  • Microsoft Edge无法启动搜索问题的解决
  • Appium Android 自动化测试 -- 元素定位
  • C#.net6.0+Vue+Ant-Design智慧医院手术麻醉系统源码 手术麻醉软件信息化管理系统 麻醉文书祥解
  • 6G时代,即将来临!
  • 进程、线程的区别
  • JWT详解、JWTUtil工具类的构建方法
  • 江协科技51单片机学习- p11 静态数码管显示
  • pandas.frame输出parquet
  • 【CT】LeetCode手撕—42. 接雨水
  • GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国
  • C# + easyui 写的一个web项目
  • JVM 垃圾回收分配及算法
  • 尚品汇-(四)
  • colima配置docker镜像源
  • Linux_内核缓冲区
  • 步步精:连接器领域的卓越品牌
  • 【Linux】基础IO_3
  • ffmpeg音视频开发从入门到精通——ffmpeg实现音频抽取
  • 计算机系统基础实训七-MallocLab实验
  • 周末总结(2024/06/22)
  • 2024.06.22【读书笔记】丨生物信息学与功能基因组学(第十七章 人类基因组 第二部分)【AI测试版】
  • SpringCloud-nacos基础
  • git的Cherry pick
  • LLC开关电源开发:第四节,LLC软件设计报告