力扣经典算法篇-23-环形链表(哈希映射法,快慢指针法)

1、题干

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

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例 1:
在这里插入图片描述
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:
在这里插入图片描述
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:
在这里插入图片描述
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:
链表中节点的数目范围是 [0, 104]
-105 <= Node.val <= 105
pos 为 -1 或者链表中的一个 有效索引 。

2、解题

前提给定:(链表节点的定义和链表的形成)

链表节点定义如下:

public class ListNode {int val;          // 节点的值ListNode next;    // 下一个节点ListNode(int x) {val = x;next = null;}
}

构建链表的方式示例:(如上示例1,[3,2,0,-4]的链表构建过程)

public static void main(String[] args) {// 创建节点ListNode head = new ListNode(3); // 3ListNode node2 = new ListNode(2); // 2ListNode node3 = new ListNode(0); // 0ListNode node4 = new ListNode(-4); // -4// 构建链表顺序和环head.next = node2;node2.next = node3;node3.next = node4;node4.next = node2;   // 环:-4 → 2System.out.println(hasCycle(head));}

方法一:(哈希映射法)

可以遍历链表数据,依次将元素全部添加到Hash结构中(如:HashSet),当Set集合中已经存在,说明进行了2次添加,即存在环。

代码示例:

public static boolean hasCycle(ListNode head) {Set<ListNode> hasSet = new HashSet<>();while (head!=null){// 方法1,通过set的包含方法校验
//            boolean contains = hasSet.contains(head);
//            if (contains){
//                // set中已经包含,二次添加,说明有环,退出循环
//                return true;
//            } else {
//                hasSet.add(head);
//            }// 方法2,通过add方法校验,add添加失败,说明节点已存在,即有环boolean addFlag = hasSet.add(head);if (!addFlag){// 没有添加成功,说明已存在,直接结束return true;}head = head.next;   // 链表向下遍历}return false;}

方法二:(快慢指针法)

定义两个指针,分别指向当前节点(慢指针)和当前节点的下一个节点(快节点)。
慢指针每次向后移动1步,快指针每次向后移动2步。
如果不存在环,那么快指针必定会优先走到链表末尾null的位置。
如果存在环,那么当快指针和慢指针都进入环后,每次增长后,两者的距离都会缩进1步,直到相遇。

代码示例:

private static boolean hasCycle(ListNode head) {if (head == null || head.next == null) {// 当前为空或指向为空,不存在环return false;}ListNode slow = head;    // 慢指针ListNode fast = head.next;   // 快指针// 当链表中存在环时,每一轮移动后,快慢指针的距离将减小一,直到slow和fast走到同一个位置。此时刚好多经历了一个环的长度Nwhile (slow != fast) {// 当链表中不存在环时,快指针将先于慢指针到达链表尾部。if (fast == null || fast.next == null) {return false;}slow = slow.next;        // 慢指针走1步fast = fast.next.next;   // 快指针走2步}// 跳出循环,说明存在环return true;}

向阳出发,Dare To Be!!!

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

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

相关文章

HarmonyOS DevEco Studio 小技巧 42 - 鸿蒙单向数据流

在鸿蒙应用开发中&#xff0c;状态管理是构建响应式界面的核心支柱&#xff0c;而 单向数据流&#xff08;Unidirectional Data Flow, UDF&#xff09;作为鸿蒙架构的重要设计原则&#xff0c;贯穿于组件通信、状态更新和界面渲染的全流程。本文将结合鸿蒙 ArkUI 框架特性&…

【LeetCode 3136. 有效单词】解析

目录LeetCode中国站原文原始题目题目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;讲解化繁为简&#xff1a;如何优雅地“盘”逻辑判断题第一部分&#xff1a;算法思想 —— “清单核对”与“一票否决”第二部分&#xff1a;代码实现 —— 清晰…

前端面试专栏-算法篇:24. 算法时间与空间复杂度分析

&#x1f525; 欢迎来到前端面试通关指南专栏&#xff01;从js精讲到框架到实战&#xff0c;渐进系统化学习&#xff0c;坚持解锁新技能&#xff0c;祝你轻松拿下心仪offer。 前端面试通关指南专栏主页 前端面试专栏规划详情 算法时间与空间复杂度分析&#xff1a;从理论到实践…

bash中||与的区别

在 Bash 中&#xff0c;|| 和 && 是两种常用的逻辑操作符&#xff0c;用于控制命令的执行流程。它们的核心区别如下&#xff1a;1. ||&#xff08;逻辑 OR&#xff09; 作用&#xff1a;如果前一个命令失败&#xff08;返回非零退出码&#xff09;&#xff0c;则执行后…

OpenCV实现感知哈希(Perceptual Hash)算法的类cv::img_hash::PHash

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 PHash是OpenCV中实现感知哈希&#xff08;Perceptual Hash&#xff09;算法的类。该算法用于快速比较图像的视觉相似性。它将图像压缩为一个简短的…

数据库迁移人大金仓数据库

迁移前的准备工作 安装官方的kdts和KStudio工具 方案说明 一、数据库迁移&#xff1a;可以使用kdts进行数据库的按照先迁移表结构、后数据的顺序迁移&#xff08;kdts的使用可以参考官方文档&#xff09; 其他参考文档 人大金仓官网&#xff1a;https://download.kingbase…

uniapp 微信小程序Vue3项目使用内置组件movable-area封装悬浮可拖拽按钮(拖拽结束时自动吸附到最近的屏幕边缘)

一、最终效果 二、具体详情请看movable-area与movable-view官方文档说明 三、参数配置 1、代码示例 <TFab title"新建订单" click"addOrder" /> // title:表按钮文案 // addOrder:点击按钮事件四、组件源码 <template><movable-area cl…

linux kernel为什么要用IS_ERR()宏来判断指针合法性?

在 Linux 内核中&#xff0c;IS_ERR() 宏的设计与内核的错误处理机制和指针编码规范密切相关&#xff0c;主要用于判断一个“可能携带错误码的指针”是否代表异常状态。其核心目的是解决内核中指针返回值与错误码的统一表示问题。以下从技术背景、设计逻辑和实际场景三个维度详…

Cookie与Session:Web开发核心差异详解

理解 Cookie 和 Session 的区别对于 Web 开发至关重要,它们虽然经常一起使用,但扮演着不同的角色。核心区别在于: Cookie:存储在客户端(用户的浏览器)的数据片段。 Session:存储在服务器端的数据结构,用于跟踪特定用户的状态。 下面是详细的对比: 特性CookieSession…

【相干、相参】 雷电名词溯源

〇、废话因缘 最近某些国产的微波制造公司总是提到一个概念【相干】【相参】【严格相参】等等概念层出不穷&#xff0c;让人苦恼。 一、这玩意还是英文溯源吧 这几个概念都聚焦在一个单词【Coherence】&#xff1b;所以就是说两个波形之间有某种联系&#xff0c;不一定就是完全…

MYSQL练习2

一、对mydb11_stu库进行查询步骤1.创建mydb11_stu库并使用2.创建score表和student表3.向两张表插入数据student表&#xff1a;score表&#xff1a;4.完成查询&#xff08;1&#xff09;分别查询student表和score表的所有记录&#xff08;2&#xff09;查询student表的第2小到5条…

Spring Boot全局异常处理:打造坚如磐石的应用防线

引言在当今的软件开发领域&#xff0c;随着业务的日益复杂和系统规模的不断扩大&#xff0c;Spring Boot 已成为 Java 开发中备受青睐的框架。它以其强大的功能、便捷的配置和快速的开发体验&#xff0c;帮助开发者们高效地构建各种应用程序。在 Spring Boot 应用的开发过程中&…

药品挂网价、药品集采价格、药品上市价格一键查询!

相信许多人在查询药品价格时感到无从下手&#xff0c;那是因为对药品定价机制和标准的不了解&#xff0c;医院及药店的药品价格查询可通过笔者之前的文章进行了解&#xff1a;如何查询药品的价格&#xff08;医院&药店&乡镇卫生院&#xff09;&#xff1f; 而今天笔者要…

【iOS】方法与消息底层分析

目录 前言 方法的本质 向不同对象发送消息 发送实例方法 发送类方法 对象调用方法 实际执行是父类 向父类发送类方法 消息查找流程 开始查找 快速查找流程 慢速查找流程 动态方法决议 应用场景 优化方案 消息转发机制 快速转发流程 应用场景 慢速转发流程 应…

如何通过 WebSocket 接口订阅实时外汇行情数据(PHP 示例)

步骤 1&#xff1a;准备工作确保已安装 PHP 和 Composer安装 WebSocket 客户端库&#xff1a;composer require textalk/websocket步骤 2&#xff1a;编写代码订阅行情以下是最简可运行的 PHP 示例&#xff0c;订阅 EUR/USD 的 1分钟K线数据&#xff1a;<?phprequire vendo…

第十八篇 数据清洗:Python智能筛选与统计:从海量Excel数据中秒级挖掘,辅助决策!你的数据分析利器!

Excel 数据挖掘Excel筛选复杂&#xff0c;统计耗时&#xff0c;无法快速挖掘数据价值1.数据筛选核心&#xff1a;df.loc与df.iloc&#xff0c;精准定位你想要的数据1.1基于条件筛选&#xff1a;过滤数据中的不恰当因素1.2 多条件组合筛选&#xff1a;精确锁定目标数据1.3字符串…

小木的机器学习日记——KNN

核心知识点总结与星级排序我为你梳理了这节课的精髓&#xff0c;并按照重要性进行了星级评定&#xff08;★★★★★为最高&#xff09;。★★★★★ 核心思想&#xff1a;回归 (Regression) 到底是什么&#xff1f;是否关键&#xff1a;是必须了解&#xff1a;是必须记住&…

Product Hunt 每日热榜 | 2025-07-15

1. OpenArt One-Click Video Story 标语&#xff1a;一键即可将任何内容转换为可随时发布的视频。 介绍&#xff1a;有一个创意、剧本、节奏&#xff0c;或者喜欢的角色吗&#xff1f;OpenArt可以将它们变成一个视觉故事—完整的画面、音乐和叙事结构&#xff0c;轻松实现&am…

Dubbo高阶难题:异步转同步调用链上全局透传参数的丢失问题

​问题场景​&#xff1a; 在分布式电商系统中&#xff0c;下单服务通过Dubbo调用库存服务&#xff08;异步接口返回CompletableFuture&#xff09;&#xff0c;同时在Gateway层通过RpcContext设置traceId。你发现&#xff1a;当库存服务内部同步调用其他服务时&#xff0c;tra…

实测两款效率工具:驾考刷题和证件照处理的免费方案

今天阿灿给大家推荐两款实用的软件&#xff0c;一款是驾考助手&#xff0c;另一款是证件照制作软件。第一款&#xff1a;驾考助手以前考驾照&#xff0c;很多人担心过不了关&#xff0c;还会花冤枉钱买VIP练习&#xff0c;精选500题。其实&#xff0c;只要用对工具&#xff0c;…