环形链表详解(让你彻底理解环形链表)

文章目录

  • 一.什么是环形链表?
  • 二.环形链表的例题(力扣)
  • 三.环形链表的延伸问题

  • 补充

一.什么是环形链表?

环形链表是一种特殊类型的链表数据结构,其最后一个节点的"下一个"指针指向链表中的某个节点,形成一个闭环。 换句话说,链表的最后一个节点连接到了链表中的某个中间节点,而不是通常情况下连接到空指针 (null)

二.环形链表的例题(力扣)

给你一个链表的头节点 head ,判断链表中是否有环。

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

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

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

这个题目,我们的做法是快慢指针思想,先设置fast和slow两个指针指向链表的开始,慢的一次走一步,快的一次走两步,如果不带环,fast的就为空,如果带环,fast就会在环里追上slow。我们来画图来看他的情况。

就是这4种情况,然后写代码就可以了,这个并不难 。

bool hasCycle(struct ListNode* head) 
{struct ListNode* slow = head, * fast = head;while (fast && fast->next)//存在奇偶{slow = slow->next;fast = fast->next->next;if (slow == fast)//相交就是环{return true;}}return false;
}

三.环形链表的延伸问题

1.为什么fast和slow一定会在环里相遇会不会在还里面错过或者永远追不上?

2.为什么一定是slow走一步fast走两步?难道不能slow一步fast走其他步数?

3.如何去求入环口的节点呢?

3.1.为什么fast和slow一定会在环里相遇会不会在还里面错过或者永远追不上?

slow和fast一定是fast先入环,这时候slow走了入环前距离的一半,随着slow进环,fast已经在环里走了一段距离了,走的多少和环的大小是有关系的,我们假设slow进环的时候离fast距离为N快的开始追慢的,慢的,每次走一步快的每次走两步就相当于追y一步,所以说他的距离变化是N,N-1,N-2。。。1,0,他们之间的距离为零时就是相遇点,所以说一定追得上。

3.2为什么一定是slow走一步fast走两步?难道不能slow一步fast走其他步数?

假设slow一步,fast3步,slow近环之后,他们的距离为N,则他们的距离变化为当N为偶数是N,N-2,N-4…..0,2。可以追得上,但是N为奇数的时候N的变化为N,N-2,N-4..1,-1。如果因为奇数距离为-1意味着他们之间的距离变成了c-1(c是环的长度),那么就要重新追,但是你重新追的话你就需要判断c-1他是不是二的倍数,如果它是的话就可以追上不是的话就追不上

在假设slow一步,fast4步,追3步,其实也是一样的,如果N是3的倍数就可以追上,但是N不是3的倍数的话,就要看,有两种情况,一种是N,N-3,N-6..2,-1。一种为N,N-3,N-6..1,-2。根据之前的结论,如c-1和c-2是3的倍数的话就可以追上

3.3如何去求入环口的节点呢?

先说结论:一个指针从相遇点开始走一个指针,从链表头开始走,他们会在环的入口点相遇。

追上的相遇的过程中,慢指针的距离:L+X,快指针的距离:L+NC+X,因为你不知道fast在环里多跑了几圈,所以设了一个N,但是N肯定>=1,又因为fast是slow的两倍,所以2(L+X)=L+NC+X。整理可得L=(N-1)X+C-X,(N-1)X就是从meetNode开始又走到meetNode的距离,C-X就是从相遇点到入口点的距离,结论得证。

struct ListNode* deCycle(struct ListNode* head)
{struct ListNode* slow = head, * fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;//相遇了if (slow == fast){struct ListNode* meet = slow;//由公式得证while (meet != head){meet = meet->next;head = head->next;}return meet;}}return NULL;}


补充

其实求入口点还有一种方法就是在入口点处,直接指向空指针,把它看作一个相交链表来做,由头节点和相遇点之前的那个节点,然后两个节点找相交点就可以了。

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

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

相关文章

Python 教学平台,支持“多班教学”的课程授课方式|ModelWhale 版本更新

龙行龘龘、前程朤朤,ModelWhale 新一轮的版本更新,期待为大家带来更优质的使用体验。 本次更新中,ModelWhale 主要进行了以下功能迭代: 新增 课程(包括课件、作业、算力)按班级管理(团队版✓ …

基于Springboot的人事管理系统 (有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的人事管理系统 (有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&am…

【Git】merge时报错:refusing to merge unrelated histories

文章目录 一、问题二、解决办法1、将feature分支的东西追加到master分支中2、将feature里的东西直接覆盖到master分支中 一、问题 今天将feature分支合并到master时报错:refusing to merge unrelated histories(拒绝合并无关历史) 报错原因&…

一篇文章速通static关键字(JAVA)

目录 1.原理——内存机制 1.1 修饰对象 1.2 lifecycle生命周期 2. 静态属性(类属性)和实例属性(对象属性) 2.1 定义方式 2.2 调用方法 3. 静态方法和属性 3.1 在同一个类中 3.2 在不同类中 4.总结(关键&#x…

SQLSyntaxEProrException异常产生原因及解决方案

java.sq1.SQLSyntaxEProrException异常产生原因及解决方案 01 异常的发生场景 在我mybatis-plus写了一个查询接口后出现的问题 java.sq1.SQLSyntaxEProrException日志报错的意思是sql语法问题 02 异常的产生及其原因 我最开始又认为是MySQL数据库表设计的问题&#xff0c…

ROS2从入门到精通:理论与实战

ROS是什么? 随着人工智能技术的飞速发展与进步,机器人的智能化已经成为现代机器人发展的终极目标。机器人发展的速度在不断提升,应用范围也在不断拓展,例如自动驾驶、移动机器人、操作机器人、信息机器人等。机器人系统是很多复杂…

外贸福利 PHP源码 WhatsApp 营销 - 批量发件人、聊天、机器人、SaaS 搭建

WhatsApp 营销工具对于外贸人员来说至关重要。随着全球贸易的不断发展,WhatsApp已成为了许多国际贸易商之间沟通的首选工具之一。通过利用WhatsApp营销工具,外贸人员可以轻松地与客户建立联系,传递产品信息,进行价格谈判&#xff…

Revit-二开之东西南北立面FilledRegion的CurveLoop计算-(4)

东西南北FilledRegion的CurveLoop计算 上一篇以东立面视图为例创建FilledRegion,接下来我们将立面视图创建FilledRegion的CurveLoop汇总一下。 上图是对四个立面坐标系间的绘制方便我们计算FilledRegion的CurveLoop。 东立面CurveLoop计算 private CurveLoop GetEastCurveL…

内网渗透-DC-9靶机渗透

攻击机:kali 192.168.236.137 目标机:dc-9 192.168.236.138 一、信息收集 1.使用arp-scan -l和nmap进行主机发现和端口信息收集 nmap -sS -T5 --min-rate 10000 192.168.236.138 -sC -p- 发现22端口被阻塞 2.whatweb收集一下cms指纹信息 what http…

Vue开发实例(七)Axios的安装与使用

说明: 如果只是在前端,axios常常需要结合mockjs使用,如果是前后端分离,就需要调用对应的接口,获取参数,传递参数;由于此文章只涉及前端,所以我们需要结合mockjs使用;由于…

《热辣滚烫》:用坚持不懈开启逆境中的职场出路

"你只活一次,所以被嘲笑也没有关系,想哭也没有关系,失败更没有关系。" “人生就像一场拳击赛,你站不起来,就永远不知道自己有多强” “命运只负责洗牌,出牌的永远是自己。” 在今年的贺岁档电影市…

云时代【6】—— 镜像 与 容器

云时代【6】—— 镜像 与 容器 四、Docker(三)镜像 与 容器1. 镜像(1)定义(2)相关指令(3)实战演习镜像容器基本操作离线迁移镜像镜像的压缩与共享 2. 容器(1)…

为什么模电这么难学?这是我见过最好的回答

大家好,我是砖一,有很多人抱怨模电难学,被誉为电子信息挂科率最高之一,下面听我分析一下为啥模电这么难学? 01 理科的抽象思维 在高等教育体系中,模电是涉及半导体方向的第一门工程类课程,是一…

2024年3月5-7日年生物发酵装备展-环科环保科技

参展企业介绍 山东环科环保科技有限公司,是一家集环保设备的设计、制造、安装、服务及环境治理工程总承包于一体的企业。 公司长期专注于大气、水、危固废三大领域,以科技创造碧水蓝天,为客户提供环保解决方案。 以稳定的产品及服务质量、适用的技术、…

【环境搭建】linux centos7安装mosquitto消息代理软件操作步骤以及遇到问题日常记录

最近需要用到mqtt, 选择安装mosquitto。由于安装mosquitto花了我一点时间,简单记录下。安装环境是linux centos7, 其他像windows、mac或者ubuntu 参考下 https://mosquitto.org/download/ 英文官网,或者别人写的文章。 服务器…

有道QAnything背后的故事---关于RAG的一点经验分享

近日,我们开源了有道自研的RAG(Retrieval Augmented Generation) 引擎QAnything。该引擎允许用户上传PDF、图片、Word、Excel、PowerPoint等多种格式的文档,并实现类似于ChatGPT的互动问答功能,其中每个答案都能精确追溯到相应的文…

了解Spring中Bean:配置与作用域

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共…

递归回溯剪枝-括号生成

LCR 085. 括号生成 - 力扣(LeetCode) 一. 根据题意,分析出符合要求的括号组合需要满足以下两个条件: 1. 左括号数或者右括号数都不能超过 n; 2. 从最左侧开始的每一个子集,不可以出现右括号数大于左括号数&…

长期可用的文件二维码怎么做?在线制作可修改的文件活码

怎么做一个可以长期使用的文件二维码呢?现在通过二维码来传递文件是很流行的一种方式,将文件生成二维码后印刷上墙或者分享给他人都可以快速完成文件的传播,所以在下发通知、资料等方面用途较多。那么文件二维码该如何生成呢? 想…

Linux内存地址空间

目录 一、虚拟地址空间 1.虚拟地址空间的定义 2.虚拟地址空间的布局 二、内存壁垒 1.内存壁垒的定义​编辑 2.段错误 三、内存映射的建立与解除 (1)mmap (2)munmap (3)堆内存的分配和释放 1.sbrk …