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

环形链表

问题描述

给你一个链表的头节点 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,一经查实,立即删除!

相关文章

Reactor 第十二篇 WebFlux集成PostgreSQL

1 引言 在现代的应用开发中&#xff0c;数据库是存储和管理数据的关键组件。PostgreSQL 是一种强大的开源关系型数据库&#xff0c;而 WebFlux 是 Spring 框架提供的响应式编程模型。本文将介绍如何使用 Reactor 和 WebFlux 集成 PostgreSQL&#xff0c;实现响应式的数据库访问…

【chrome扩展开发】消息通讯之onMessage消息监听

前言 chrome.runtime.onMessage.addListener 是 Chrome 扩展程序中用于监听其他模块发送的消息并做出响应的 API 当从扩展进程 (by runtime.sendMessage) 或内容脚本 (by tabs.sendMessage)发送消息时触发 语法 chrome.runtime.onMessage.addListener(callback: function, )ca…

使用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;默认安装第三方…

题目:2859.计算 K 置位下标对应和

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2859. 计算 K 置位下标对应元素的和 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 逐个计算下标是否符合要求即可。 解题代码&#xff1a; class Solution {public int sumIndicesWithK…

敏捷开发工具:提升软件研发效率的重要利器

在当今的软件开发领域&#xff0c;敏捷开发方法越来越受到推崇。敏捷开发的核心是灵活应对需求变化&#xff0c;以快速迭代的方式不断优化产品。为了助力敏捷开发的实施&#xff0c;各种敏捷开发工具应运而生。 本文将介绍几种常用的敏捷开发工具&#xff0c;阐述其特点、应用…

18 Python的sys模块

概述 在上一节&#xff0c;我们介绍了Python的os模块&#xff0c;包括&#xff1a;os模块中一些常用的属性和函数。在这一节&#xff0c;我们将介绍Python的sys模块。sys模块提供了访问解释器使用或维护的变量&#xff0c;以及与解释器进行交互的函数。 通俗来讲&#xff0c;sy…

第三十一章 Classes - 继承规则

第三十一章 Classes - 继承规则 继承规则 与其他基于类的语言一样&#xff0c;可以通过继承组合多个类定义。 类定义可以扩展&#xff08;或继承&#xff09;多个其他类。这些类又可以扩展其他类。 请注意&#xff0c;类不能继承 Python 中定义的类&#xff08;即 .py 文件中…

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

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

入行IC | 新人入行IC选择哪个岗位更好?

很多同学入行不知道怎么选择岗位。IC的岗位一般有设计、验证、后端、封装、测试、FPGA等等。但是具体到每个人身上&#xff0c;就要在开始的时候确定下你要找的职位&#xff0c;可以有两个或三个&#xff0c;但是要分出主次&#xff0c;主次不分会让你纠结整个找工作的过程。 …

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;不过规则没有变&…

ORACLE多列中取出数据最大的一条

1.需求说明&#xff1a; 当查询出来的数据存在多条数据时&#xff0c;想按照一定条件排序取出其中一条数据。 2.使用函数&#xff1a; row_number() over( partition by 分组字段 order by 排序字段 desc&#xff09; 3.示例&#xff1a; --根据table_a中的pk_house&#x…

狗dog 数据集VOC-5912张

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

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

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

超自动化的未来

如今&#xff0c;部分企业正尝试从小规模的自动化开始&#xff0c;将超级自动化用于营销分析和数据库维护等不同任务。企业应该对超自动化进行更深入的挖掘&#xff0c;如果人们能够更加仔细的观察总结企业的每个流程&#xff0c;那么就能发现更多可以从自动化技术中受益的领域…

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服务…

openstack的port重建流程【neutron port-show 中的ip信息】

文章目录 说明日志prot重建过程 说明 为什么要重建port&#xff0c;是因为有一台虚拟机迁移失败回退后依然无法启动&#xff0c;原因是因为不能重建网络&#xff0c;所以尝试重建port解决这个问题。而重建port信息后&#xff0c;问题解决&#xff0c;虚拟机可以正常启动了。 …