【数据结构】链表OJ面试题3《判断是否有环》(题库+解析)

1.前言 

前五题在这http://t.csdnimg.cn/UeggB

后三题在这http://t.csdnimg.cn/gbohQ

记录每天的刷题,继续坚持!

2.OJ题目训练

9. 给定一个链表,判断链表中是否有环。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路

快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表其实位置开始运行, 如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。比如:操场跑步

以这个环形链表距离,当我们指针进环后,相当于进入了2 0 -4的循环,我们可以将这三步类比成在环形操场跑步

可以假设A和B在操场同一个起点开始跑步,A的速度是一次跑一米,B的速度是一次跑两米

以此来进行当A跑半圈时,B已经跑完一圈了,而当A跑一圈时,B也跑完两圈了,这样他们就在起点相遇了。

我们就可以利用这一特性,类比到环形数组中。

注意要点

  1. 环形链表是没有尾指针的(没有下一个节点为NULL),利用这个特性我们第一步可以很轻松的判断是否为环形节点
  2. 避免越界访问(限制条件)

附源代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
bool hasCycle(struct ListNode *head) {struct ListNode *first = head ,*slow = head;while(first!=NULL&&first->next!=NULL && slow->next!=NULL)   //防止越界访问报错{first = first->next->next;  slow = slow->next;if(first == slow){return true;}}return false;
}

【扩展问题】

为什么快指针每次走两步,慢指针走一步可以?

假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。当慢指针刚 进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。 此时,两个指针每移动一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情 况,因此:在满指针走到一圈之前,快指针肯定是可以追上慢指针的,即相遇。

假设fast走是两步的指针,slow是走一步,当slow进环后,才正式开始追击,我们假设他们之间的距离为N,由于进入的是一个环,每当各自行动一步,他们距离就会变成N-1。直到为0相遇为止。

快指针一次走3步,走4步,...n步行吗?

fast先走

当slow进环以后,fast开始追击slow,1假设slow入环时,他们之间的距离是 M


每追击一次,他们之间距离缩小2(slow+1,fast+3,相对距离就缩小2)。追击过程中,他们之间的距离变化

  • 当M为偶数,每次缩小2的距离,那最终都会相遇
  • 当M为奇数,每次缩小2的距离,最终都会错过

我们可以继续讨论M为奇数的情况

当fast错过slow时,他们间隔相差为1

我们假设进环后的周长为C

所以他们的相对距离就为C-1,而这样我们又可以分类讨论。

所以只有当M为奇数,且C为偶数(C-1为奇数)才会达成他们永远不可能相交的情况

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

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

相关文章

如何使用六图一表七种武器

六图一表七种武器用于质量管理: 描述当遇到问题时应该用那张图来解决: 一、如果题目说出了质量问题需要找原因? 解:用因果图,因果图也称石川图或鱼骨图 二、如果要判断过程是否稳定受控? 解&#xff1a…

4核8G服务器支持多少人同时在线访问?

腾讯云4核8G服务器支持多少人在线访问?支持25人同时访问。实际上程序效率不同支持人数在线人数不同,公网带宽也是影响4核8G服务器并发数的一大因素,假设公网带宽太小,流量直接卡在入口,4核8G配置的CPU内存也会造成计算…

【51单片机】LCD1602(江科大)

1.LCD1602介绍 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 显示容量:162个字符,每个字符为5*7点阵 2.引脚及应用电路 3.内部结构框图 屏幕: 字模库:类似于数码管的数…

一起玩儿Proteus仿真(C51)——05. 红绿灯仿真(一)

摘要:本文介绍如何仿真红绿灯 今天来做一个红绿灯仿真的程序,这个程序主要包括一下这些功能: 模拟的路口为十字交叉路口,假设东西和南北方向都是双向行驶,因此需要设置4组红绿灯和4个倒计时显示屏。倒计时时间最长为9…

【教程】C++语言基础学习笔记(七)——Array数组

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【C语言基础学习】系列文章 第一章 《项目与程序结构》 第二章 《数据类型》 第三章 《运算符》 第四章 《流程控制》 第五章…

Linux_进程概念

硬件系统 软件系统 进程概念 进程状态 孤儿进程 进程优先级 一.硬件系统 1.1 冯诺依曼体系结构 数学家冯诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备&a…

Python学习之路-爬虫提高:scrapy基础

Python学习之路-爬虫提高:scrapy基础 为什么要学习scrapy 通过前面的学习,我们已经能够解决90%的爬虫问题了,那么scrapy是为了解决剩下的10%的问题么,不是,scrapy框架能够让我们的爬虫效率更高 什么是scrapy Scrapy是一个为了…

tee漏洞学习-翻译-3:TrustZone exploit for MSM8974

原文:http://bits-please.blogspot.com/2015/08/full-trustzone-exploit-for-msm8974.html 在这篇博文中,我们将介绍利用上一篇文章中描述的 TrustZone 漏洞的完整过程。 在开发此漏洞时,我只使用了我值得信赖的(个人&#xff0…

120.乐理基础-五线谱-五线谱的多声部与指法问题

内容参考于:三分钟音乐社 上一个内容:119.乐理基础-五线谱-五线谱的标记-CSDN博客 五线谱多声部与简谱的多声部一样:简谱的多声部 五线谱多声部例子:钢琴谱 另一个例子:在纵向上有多个音符 然后放大之后&#xff0c…

【51单片机】利用【时间延迟】的原理规避【按键抖动问题】

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 本章是51LCD单片机设计的一个环节,完整可前往相应博客查看完整传送门 欢迎订阅 YY滴C专栏!更多干货持续更新!以下…

详解CC++内存管理(new和delete)

文章目录 写在前面1. C&C内存分布2. C语言中动态内存管理方式:malloc/calloc/realloc/free3. C内存管理方式(语法)3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. new和delete的实现原理4.1 operator new与operator delete…

数据结构——6.2 图的存储与基本操作

6.2 图的存储与基本操作 概念 图的存储 邻接矩阵存有向图和无向图 根据邻接矩阵求度: 无向图:第i个结点的度 第i行 (或第列) 的非零元素个数 有向图: 第i个结点的出度 第i行的非零元素个数 第i个结点的入度 第i列的非零元素个数 第i个结…

Stable Diffusion教程——stable diffusion基础原理详解与安装秋叶整合包进行出图测试

前言 在2022年,人工智能创作内容(AIGC)成为了AI领域的热门话题之一。在ChatGPT问世之前,AI绘画以其独特的创意和便捷的创作工具迅速走红,引起了广泛关注。随着一系列以Stable Diffusion、Midjourney、NovelAI等为代表…

linux信号机制[一]

目录 信号量 时序问题 原子性 什么是信号 信号如何产生 引入 信号的处理方法 常见信号 如何理解组合键变成信号呢? 如何理解信号被进程保存以及信号发送的本质? 为什么要有信号 信号怎么用? 样例代码 core文件有什么用呢&#…

Docker基础与持续集成

docker 基础知识: docker与虚拟机 !左边为虚拟机,右边为docker环境 – Server :物理机服务器Host OS :构建的操作系统Hypervisor :一种虚拟机软件,装了之后才能虚拟化操作系统Guest OS :虚拟化的操作系统…

自动驾驶轨迹规划之kinodynamic planning

欢迎大家关注我的B站: 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 本文PPT来自深蓝学院《移动机器人的运动规划》 目录 1.kinodynamic的背景 2. old-school pipline 3.example 1.kinodynamic的背景 kinodynami…

java之jvm详解

JVM内存结构 程序计数器 Program Counter Register程序计数器(寄存器) 程序计数器在物理层上是通过寄存器实现的 作用:记住下一条jvm指令的执行地址特点 是线程私有的(每个线程都有属于自己的程序计数器)不会存在内存溢出 虚拟机栈(默认大小为1024kb) 每个线…

LeetCode、739. 每日温度【中等,单调栈】

文章目录 前言LeetCode、739. 每日温度【中等,单调栈】题目链接及分类思路单调栈 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技…

二次元自适应动态引导页

源码介绍 二次元自适应动态引导页,HTMLJSCSS,记事本修改,上传到服务器即可,也可以本地双击index.html查看效果 下载地址 https://wfr.lanzout.com/isRem1o7bfcb

MockServer 服务框架设计

大部分现有的 mock 工具只能满足 HTTP 协议下简单业务场景的使用。但是面对一些复杂的业务场景就显得捉襟见肘,比如对 socket 协议的应用进行 mock,或者对于支付接口的失败重试的定制化 mock 场景。 为解决上述问题,霍格沃兹测试学院设计并研…