算法通关村-----链表中环的问题

2023-11-03

环形链表

问题描述

给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。如果链表中存在环 ,则返回 true 。 否则,返回 false 。详见leetcode141

问题分析

最直接的方式就是利用集合来判断,遍历链表节点,判断该节点是否存在于集合中,如果存在,则说明链表中存在环,如不存在,继续遍历,如果遍历结束后仍未发现当前遍历节点存在于集合中,则链表中不存在环。

上面提到的方式简单直接,但是在面试中一般不允许使用has或者集合的方式。除此之外,我们可以考虑双指针,如果链表中存在环,则快慢指针,一定会相遇,我们假设fast指针每次走两步,slow指针每次走一步,当fast指针即将追上slow指针时,存在两种情况,fast指针与slow指针相差两步或者相差一步,当相差一步时,下一次fast指针走两步,slow指针走一步,相遇,当相差两步时,下一次slow指针走一步,fast指针走两步,变成相差一步的情况,综上,只要链表中存在环,slow指针和fast指针一定会相遇。

代码实现

使用集合实现

public boolean hasCycle(ListNode head) {
	ListNode current = head;
	Set<ListNode> set = new HashSet<>();
	while(current!=null){
	    if(set.contains(current)){
	        return true;
	    }else{
	        set.add(current);
	    }
	    current = current.next;
	}
	return false;
}

使用双指针实现

public boolean hasCycle(ListNode head) {
    ListNode fast = head;
    ListNode slow = head;
    while(fast!=null&&fast.next!=null){
        fast = fast.next.next;
        slow = slow.next;
        if(fast==slow){
            return true;
        }
    }
    return false;
}

环形链表 II

问题描述

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。详见leetcode142

问题分析

找环的入口比较复杂,可以结合下图进行理解。假设链表中存在环,非环长度为a,环长度为b,则使用快慢指针一定会相遇。我们分析相遇时的情况。fast指针式slow指针速度的两倍,则f=2s,fast比slow指针多走了n个环的长度,f=s+nb,联立方程,得f=2nb,s=nb,当s走到环的入口时,s = a+nb,我们想要找到环的入口,只需要让slow指针在走a步,如何确定a的值呢,我们仍然使用双指针来实现。让fast指针指向head,每次走一步,slow与fast同步走,两者在一起走a步,在环入口相遇

环

代码实现

public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
    ListNode fast = head;
    while(fast!=null&&fast.next!=null){
        fast=fast.next.next;
        slow = slow.next;
        if(fast==slow){
            break;
        }
    }
    if(fast==null||fast.next==null){
        return null;
    }
    fast = head;
    while(fast!=slow){
        fast = fast.next;
        slow = slow.next;
    }
    return slow;
}

总结

链表没有下标,所以只能靠指针遍历的方式操作元素,但是一个指针在链表有环的前提下无法确定终止条件,所以,我们使用双指针来解决链表环的问题,常见环的问题就是判断是否有环和找到环的入口,上面的思路可能比较复杂,可以结合图示来理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法通关村-----链表中环的问题 的相关文章

  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • 重构——套接字中的良好实践——简单的服务器-客户端 Swing 应用程序

    我使用单例和观察者模式编写了一个带有 Swing 接口的简单服务器 客户端程序 每个客户端都连接到服务器并可以发送消息 服务器将其收到的消息转发给其余的客户端 客户端使用 GUI 允许它们随时连接和断开与服务器的连接 该程序运行得很好 因为
  • Java中定义类型后同时初始化多个变量?

    这里需要一些语法方面的帮助 我正在尝试在定义类型后重新初始化多个变量 例如 int bonus sales x y 50 这工作正常 但是我想稍后在程序中将不同的值放入其中一些变量中 但我收到语法错误 bonus 25 x 38 sales
  • JBoss AS 5 中的共享库应该放在哪里?

    我是 Jboss 新手 但我有多个 Web 应用程序 每个应用程序都使用 spring hibernate 和其他开源库和 portlet 所以基本上现在每个 war 文件都包含这些 jar 文件 如何将这些 jar 移动到一个公共位置 以
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • WebLogic 10 中的临时目录

    每当 WL 停止时 它都不会删除其临时目录 即 domains mydomain servers myserver tmp WL TEMP APP DOWNLOADS domains mydomain servers myserver tm
  • 使用 JAXB 编组 LocalDate

    我正在构建一系列链接类 我希望能够将其实例编组到 XML 以便我可以将它们保存到文件中并稍后再次读取它们 目前我使用以下代码作为测试用例 import javax xml bind annotation import javax xml b
  • 空 EntityManager/EJB 注入 MDB

    我有一个消息驱动 bean MDB 部署到 WebLogic 12 1 3 我尝试使用 PersistenceContext 注释将实体管理器注入 MDB 但实体管理器为空 我还尝试注入一个简单的无状态会话 bean 它也是空的 但是 Me
  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • JAX-WS:有状态 WS 在独立进程中失败

    我在 Tomcat 上部署了一个有状态的 Web 服务 它由工厂服务和主要 API 服务组成 并且工作得很好 工厂服务将 W3CEndpointReference 返回到主 API 实例 客户端使用会话 现在 我尝试将相同的服务作为独立应用
  • 通过 JNI 从 Applet 调用 DLL

    我有一个 概念验证 的作品 它跨越了一些不熟悉的领域 我的任务是将 EFTPOS 机器连接到在内联网浏览器中作为小程序运行的应用程序 我暂时忽略了 EFTPOS dll 并用我选择的语言 Delphi 创建了一个简单的 JNI 修饰的 DL
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • Jenkins 管道和 java.nio.file.* 方法的问题

    我正在尝试使用 java nio file 中的方法在 Jenkins 管道中执行一些基本文件操作 无论代码存在于哪个节点块中 代码都在主节点上执行 在管道中 我已经验证了各个节点块都是正确的 它们唯一地标识了特定的节点 但是 pathEx
  • 设计抽象类时是否应该考虑序列化问题?

    一般来说这个问题来自Eclipse建议在抽象类上添加串行版本UID 由于该类是抽象类 因此该类的实例永远不会存在 因此它们永远不会被序列化 只有派生类才会被序列化 所以我的问题是放置一个安全 SuppressWarnings serial
  • 如何使用maven创建基于spring的可执行jar?

    我有一个基于 Maven 的 Spring WS 客户端项目 我想将其打包为单个 jar 在eclipse中 一切运行正常 当我尝试将其打包为可执行 jar 时 我收到 ClassNotFound 异常 因为 Spring jar 未包含在
  • Java中的媒体播放器库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在评估用于在 Java 中播放音频 视频的库 它不需要 100 Java Java 与本机库的绑定
  • SWT - 与操作系统无关的获取等宽字体的方法

    SWT 有没有一种方法可以简单地获得跨各种操作系统的等宽字体 例如 这适用于 Linux 但不适用于 Windows Font mono new Font parent getDisplay Mono 10 SWT NONE 或者我是否需要
  • 条件查询:按计数排序

    我正在尝试执行一个标准查询 该查询返回 stackoverflow 中回答最多的问题 例如常见问题解答 一个问题包含多个答案 我正在尝试使用标准查询返回按每个问题的答案数排序的回答最多的问题 任何人都知道我应该在 hibernate cri
  • Java:基于 Web 的应用程序中的单例类实例

    我在 Web Application 中有这个 Singleton 类 public class MyDAO private static MyDAO instance private MyDAO public static MyDAO g
  • 编译时在代码中替换Java静态最终值?

    在java中 假设我有以下内容 fileA java class A public static final int SIZE 100 然后在另一个文件中我使用这个值 fileB java import A class b Object t

随机推荐

  • Java中接口中的方法定义规范

    1 接口中是可以定义静态方法的 静态方法必须要有实现 且这个静态方法只能用public修饰 例如 public static void test 或 static void test public省略不写默认也是用public来修饰 静态方
  • 服务计算——Docker 简单使用

    Docker 简单使用 Docker是一个应用容器引擎 使用者可以将其应用以及所有需要的依赖打包到一个包中 然后发布到机器上进行运作 接下里我们就一步步了解一些Docker的使用 Docker安装 sudo apt get install
  • STM32-GPIO输入

    点亮LED灯的实验室利用的GPIO的输出配置来实现的 接下来写一个关于GPIO作为输入的程序 同时点亮和熄灭LED灯 由于程序简单 直接贴出代码 以供参考 include stm32f10x h brief 初始化GPIO 默认速度为GPI
  • 判断英伟达显卡计算力及是否支持FP16和INT8

    文章目录 1 检查显卡的计算力 打开 官网 检查你相应型号显卡的算力 比如GTX1080 is 6 1 Tesla T4 is 7 5 2 检查是否支持FP16和INT8 打开网页查看
  • Python 3.11.3在Windows 11下的简易安装教程

    撰写时间 2023年4月6日 本文目的 帮助电脑小白快速安装最新版本的Python 并通过控制台输出第一个Python语句 Hello World 前言 Python是一种高级编程语言 具有简单易学 代码简洁 功能强大 可移植性佳等特点 由
  • 《30天自制操作系统》harib09c的编译和调试

    今天是 30天自制操作系统 学习的第12天 今天的工程目录是harib09c 我起的目录名称是day12 boyC 我们一起来调试一下 在day12 boyC目录下直接运行make命令就开始编译了 如下图所示 编译的结果如下 部分截取 E
  • Java Interface

    Java接口中的成员变量的修饰符都是 public的 static的 final 的 类这么写错的 一个类不能既是final 又是abstract的 因为abstract 因为类被继承使用 而 final却不允许类被继承 这是自相矛盾的 p
  • 从零开始学WEB前端——VUE脚手架

    项目介绍 先做个自我介绍 本人是一个没人写前端所以就自学前端的后端程序员 在此项目中我会和大家一起从零基础开始学习前端 从后端程序员的视角来看前端 受限于作者的水平本项目暂时只会更新到前端框架VUE 不会涉及node js 该项目适合零基础
  • Nginx安装、配置

    一 Nginx概述 特点 Nginx engine x 是一个轻量级的 高性能的 基于Http的 反向代理服务器 静态web服务器 具有以下特点 1 高并发 一个Nginx服务器在不做任何配置的情况下并发量可达1000左右 在硬件条件允许的
  • unity hub突然打不开,解决记录

    1 情况 管理员身份运行无效 从unity cn下载安装无效 从unity com下载安装无效 2 失败原因 安装的时候一直用的之前的安装路径 始终打不开 3 解决 换了新的安装路径 成功解决
  • 开源进展|WeCross v1.3.0发布,支持适配FISCO BCOS v3.0

    WeCross是微众银行自主研发并完全开源的区块链跨链协作平台 致力于促进跨行业 机构和地域的跨区块链信任传递和商业合作 有助于实现异构区块链系统之间安全可信的互操作 WeCross v1 2 0自发布以来 得到了众多社区伙伴的支持和反馈
  • BlogTest1

    常见数据结构题 SparseArray SparseBooleanArray HashMap
  • 安防监控视频云存储平台EasyNVR出现内核报错的情况该如何解决?

    安防视频监控汇聚EasyNVR视频集中存储平台 是基于RTSP Onvif协议的安防视频平台 可支持将接入的视频流进行全平台 全终端分发 分发的视频流包括RTSP RTMP HTTP FLV WS FLV HLS WebRTC等格式 近期有
  • 【全教程】Pycharm运行深度强化学习代码(pytho与matlab混编)

    记录自己运行的第一个深度强化学习项目的全过程 配置环境花了4h 代码终于跑起来啦 配置环境 下面是具体的配置流程 首先报的第一个错误是 ModuleNotFoundError No module named matlab engine ma
  • Arduino和LabVIEW射频灾害紧急报警系统

    该项目将在发生灾难时生成紧急警报 该系统分为两部分 传感器节点和 2 服务器 连接该开关阵列以在处理端生成紧急信号 然后将其发送到传感器节点 图1给出了系统框图 物料清单 接线 原理图 代码 传感器节点端代码 处理端代码 仿真模型 LabV
  • 【实验五】【创建视图并通过视图操作表数据】

    文章目录 视图 原表 一 创建视图 二 插入数据 三 更新数据 四 删除数据 Reference 视图 简介 视图可以看作定义在SQL Server上的虚拟表 视图正如其名字的含义一样 是另一种查看数据的入口 常规视图本身并不存储实际的数据
  • 渗透第一步之DNS信息收集技巧。

    正向查询 首先 最简单最快速的是 使用ping命令输入域名来获取其ip地址 或者 使用nslookup命令来指定域名获取ip地址 Server 192 168 90 83 DNS服务器 Address 192 168 90 83 我们解析到
  • Redis实现用户签到

    目录 一 BitMap用法 1 介绍 2 用法 3 练习 二 签到功能 1 需求 2 代码实现 三 签到统计 1 分析 2 接口实现 一 BitMap用法 1 介绍 我们完全可以通过数据库签到表来实现签到功能 但是假如我们的用户达到千万 每
  • 关于VS2019出现“const char *“ 类型的实参与 “char *“ 类型的形参不兼容错误的解决方法

    解决办法 法1 在VS2019中依次点击项目 gt 属性 gt C C gt 语言 gt 符合模式 将原来的 是 改为 否 即可 法2 这种问题也有可能是因为局部变量没有进行初始化内存 也就是new和delete操作符的运用 include
  • 算法通关村-----链表中环的问题

    环形链表 问题描述 给你一个链表的头节点 head 判断链表中是否有环 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置 索