当前位置: 首页 > 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点。

相关文章:

  • JAVA大型医院绩效考核系统源码:​医院绩效考核实施的难点痛点
  • STL——函数对象,谓词
  • VMware虚拟机三种网络模式设置 - Bridged(桥接模式)
  • 王老吉“杀疯啦”?传统品牌如何创新营销“破圈”而出
  • 《计算机英语》 Unit 3 Software Engineering 软件工程
  • vue实现不预览PDF的情况下打印pdf文件
  • 【专业英语 复习】第10章 Information System
  • 奔驰EQS SUV升级原厂主动式氛围灯效果展示
  • Ruby 注释
  • AcWing 255. 第K小数
  • C++之std::queue::emplace
  • ArcGIS与Excel分区汇总统计三调各地类面积!数据透视表与汇总统计!
  • 在同一个 Blazor 应用中结合 SQL-DB 和 MongoDB
  • windows设置开机启动项
  • 如何卸载宝塔面板?
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 「面试题」如何实现一个圣杯布局?
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • dva中组件的懒加载
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • IP路由与转发
  • k个最大的数及变种小结
  • MySQL主从复制读写分离及奇怪的问题
  • react-native 安卓真机环境搭建
  • SpriteKit 技巧之添加背景图片
  • vue 配置sass、scss全局变量
  • 大整数乘法-表格法
  • 复杂数据处理
  • 扑朔迷离的属性和特性【彻底弄清】
  • 推荐一个React的管理后台框架
  • 学习JavaScript数据结构与算法 — 树
  • 译自由幺半群
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #pragma multi_compile #pragma shader_feature
  • #stm32驱动外设模块总结w5500模块
  • #数据结构 笔记三
  • (MATLAB)第五章-矩阵运算
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (笔试题)分解质因式
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (原)Matlab的svmtrain和svmclassify
  • (转) Android中ViewStub组件使用
  • (转)Google的Objective-C编码规范
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ... 是什么 ?... 有什么用处?
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .NET企业级应用架构设计系列之开场白
  • .考试倒计时43天!来提分啦!
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [Asp.net MVC]Bundle合并,压缩js、css文件