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

环形链表

问题描述

给你一个链表的头节点 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;
}

总结

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

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

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

相关文章

使用Scrapy构建高效的网络爬虫

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Scrapy是一个强大的Pyth…

python虚拟环境(venv)

一、什么是python环境 首先要知道什么是python环境&#xff1f; Python环境主要包括以下内容&#xff1a; 解释器 python.exe (python interpreter&#xff0c;使用的哪个解释看环境配置) Lib目录 标准库 第三方库&#xff1a;site-pakages目录&#xff0c;默认安装第三方…

基于DSPACE功率平衡理论的并联有源电力滤波器模型(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

webpack配置alias后eslint和ts无法识别

背景 我们在 webpack 配置 alias 后&#xff0c;发现项目中引入的时候&#xff0c;还是会报错&#xff0c;如下&#xff1a; 可以看到&#xff0c;有一个是 ts报错&#xff0c;还有一个是 eslint 报错。 解决 ts 报错 tsconfig.json {"compilerOptions": {...&q…

【力扣每日一题】2023.9.18 打家劫舍Ⅲ

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 今天是打家劫舍3&#xff0c;明天估计就是打家劫舍4了。 今天的打家劫舍不太一样&#xff0c;改成二叉树了&#xff0c;不过规则没有变&…

狗dog 数据集VOC-5912张

狗&#xff0c;是食肉目犬科犬属 哺乳动物 &#xff0c;别称犬&#xff0c;与马、牛、羊、猪、鸡并称“六畜” 。狗的体型大小、毛色因品种不同而不同&#xff0c;体格匀称&#xff1b;鼻吻部较长&#xff1b;眼呈卵圆形&#xff1b;两耳或竖或垂&#xff1b;四肢矫健&#xff…

网站降权的康复办法(详解百度SEO数据分析)

随着搜索引擎算法的不断升级&#xff0c;很多网站在SEO优化过程中遭遇到降权的情况。如果您的网站也遭遇到了类似的问题&#xff0c;不必惊慌失措。本文将为您详细介绍网站降权恢复的方法&#xff0c;包括百度SEO数据分析、网站收录少的5个原因、网站被降权的6个因素以及百度SE…

IP风险查询:抵御DDoS攻击和CC攻击的关键一步

随着互联网的普及&#xff0c;网络攻击变得越来越普遍和复杂&#xff0c;对企业和个人的网络安全构成了重大威胁。其中&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击和CC&#xff08;网络连接&#xff09;攻击是两种常见且具有破坏性的攻击类型&#xff0c;它们…

js写一个判断字符串是否能够转为JSON 的函数

其实非常简单 这里我们需要涉及到 捕获异常 因为如果你直接在if里面转 我已经试过了 直接就报错了 一点面子不给 我们写一个这样的函数 function isJsonString(str) {try {JSON.parse(str);return true;} catch (e) {return false;} }编写如下代码 console.log(isJsonString(…

企业架构LNMP学习笔记58

开始学习Tomcat&#xff1a; 学习目标和内容&#xff1a; 1&#xff09;能够描述Tomcat的使用场景&#xff1b; 2&#xff09;能够简单描述Tomcat的工作原理&#xff1b; 3&#xff09;能够实现部署安装Tomcat&#xff1b; 4&#xff09;能够实现和配置Tomcat的Server服务…

VMware虚拟机如何设置网络

一直没弄明白怎么能让虚拟机正常上网和访问&#xff0c;最近总结一个小经验 要在宿主机访问虚拟机电脑服务器&#xff0c;要设置成nat格式&#xff0c;虚拟机可以上网&#xff0c;宿主机访问虚拟机上的ip即可访问虚拟机里的服务器&#xff0c;也就是这样设置就行。 这时候ip不…

blender怎么设置中文界面

你们知道Blender软件是什么吗&#xff1f;你知道blender怎么设置中文界面吗&#xff1f;Blender是个GNU的3D绘图软件&#xff0c;建模、算图、动画等功能都相当的完整&#xff0c;可以说已经具有了一般商业软件的规模。Blender大部分的功能都有热键&#xff0c;操作起来相当地轻…

实现安全的服务通信:探索如何使用服务网格来确保服务间的安全通信

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

22.2 JavaScript 常用操作

1. BOM操作 浏览器对象模型(BOM): 是JavaScript与浏览器交互的接口集合. 它提供了一组对象, 用于操作浏览器窗口, 历史记录, 文档等. BOM可以通过Javascript代码来访问和控制浏览器的功能和行为.BOM的核心对象是window对象, 它表示浏览器的窗口或框架. 通过window对象, 可以访…

Matlab图像处理-强度分层法

强度分层法 强度分层技术是最简单的伪彩色图像处理方法之一。 如果将一幅图像被描述为空间坐标(x,y) 的强度函数f(x,y) &#xff0c;则分层的方法可以看作是将一些平面平行于图像坐标平面(x,y) &#xff0c;然后将每个平面在相交区域切割图像函数。下图展示了使用平面将图像函…

【基础篇】六、基于SpringBoot来整合SSM的案例(下)

文章目录 1、前后端调用&#xff1a;axios发送异步请求2、添加功能3、删除功能4、修改功能5、异常消息处理6、分页功能7、分页Bug处理8、条件查询 接下来加入前端页面&#xff0c;使用axios发送异步请求调用上篇的接口。调前端代码时&#xff0c;发现还挺有趣&#xff0c;刷新、…

基于SSM的电动车租赁网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

最新AI创作系统+ChatGPT商业运营源码+支持GPT4.0+支持国内AI模型/支持AI绘画

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

ADB底层原理

介绍 adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb我们可以在Eclipse/Android Studio中方便通过DDMS来调试Android程序&#xff0c;说白了就是debug工具。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的and…

Kotlin simple convert ArrayList CopyOnWriteArrayList MutableList

Kotlin simple convert ArrayList CopyOnWriteArrayList MutableList Kotlin读写分离CopyOnWriteArrayList_zhangphil的博客-CSDN博客Java并发多线程环境中&#xff0c;造成死锁的最简单的场景是&#xff1a;多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2&#xff0c;而多…