单链表OJ题:LeetCode--141.环形链表

news2024/11/25 7:03:41

朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中的第141道单链表OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

数据结构与算法专栏:数据结构与算法

个  人  主  页 :stackY、

C 语 言 专 栏:C语言:从入门到精通

LeetCode--141.环形链表:https://leetcode.cn/problems/linked-list-cycle/description/

 1.题目介绍

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

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

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

2.实例演示 

 

3.题解思路 

在这里如果使用最基础的方法来判断环形链表会比较麻烦,而且办法也不是很多,那么在这里小编给大家提供一种方法,依旧是我们熟悉的快慢指针的方法:

        我们可以设置一个快指针和一个慢指针,如果有环,那么快指针和慢指针必定可以在环中相遇,因为快指针的速度始终是慢指针的2倍,所以快指针可以在环中追上慢指针,我们先来使用这种比较简便的方法,后面我们可以来验证一下:

代码演示:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    //设置快慢指针
    struct ListNode* slow = head;
    struct ListNode* fast = head;

    while(fast && fast->next)
    {
        //快指针一次走两步
        fast = fast->next->next;
        //慢指针一次走一步
        slow = slow->next;
        //如果在环中相遇就带环
        if(fast == slow)
        {
            return true;
        }
    }
    //如果整个链表都走完了还是没有相遇则不带环
    return false;
}

这种方法看似简单,但是该如何证明呢?我们接着往下看:

4.拓展面试题

1. 假设有环,快指针一次走一步,慢指针一次走两步,快指针一定会追上慢指针吗?

 快指针速度是慢指针的2倍,所以快指针先进环,慢指针后进环,我们假设快指针和慢指针相距为N,慢指针(slow)进环之后,快指针(fast)开始追击慢指针(slow),快指针一次走两步,慢指针一次走1步,那么它们的距离随着它们走的步数会逐渐的缩小1,就是一个公差为-1的等差数列,那么只要走的步数够多,快指针一定可以和慢指针相遇。

所以慢指针一次走一步,快指针一次走两步,一定会追上。

2. 假设有环,如果快指针走任意步数,慢指针走一步,快指针能追上慢指针吗?

在这里我们假设快指针一次走三步,慢指针一次走1步。

快指针速度是慢指针的3倍,所以快指针先进环,慢指针后进环,我们假设快指针和慢指针相距为N,慢指针(slow)进环之后,快指针(fast)开始追击慢指针(slow),快指针一次走3步,慢指针一次走1步,那么它们的距离随着它们走的步数会逐渐的缩小2,就是一个公差为-2的等差数列,这时我们需要计算一下它们之间的距离:

快慢指针的距离会随着步数的增加最后变为-1,这就表示会开始下一轮的追击,那么下一轮的追击就可以分为两种情况:

1. 假设环的周长为C,那么快慢指针的距离就变为了C-1,这时C-1如果为奇数,那么永远追不上。

2. 假设环的周长为C,那么快慢指针的距离就变为了C-1,这时C-1如果为偶数,那就就可以追上。

总结:

1. 快指针一次走一步,慢指针一次走两步,快指针一定会追上慢指针。

2. 如果快指针走任意步数,慢指针走一步,快指针不一定能追上慢指针。

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!

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

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

相关文章

龙岗区五联土地整备利益统筹项目,集体物业集中签约仪式

五联土地整备利益统筹项目启动以来街道高度重视相关工作开专题会、建工作组、设党支部把征拆工作一项项推进 截至6月1日已完成: 清租签约73户,面积9.55万m(意向签约17户,约1.66万m) 私人住宅业主补偿安置签约8户&…

Java语言----反射、枚举以及lambda表达式

目录 一.反射 1.1反射的基本情况 1.2反射中最重要的类 1.2.1 Class类 1.2.2Field类 1.2.3Constructor类 1.2.4Methood类 1.3反射优缺点 二.枚举 2.1概念 2.2枚举(enum)类方法 2.3枚举的构造 三.Lambda表达式 3.1Lambda介绍 3.2 函数式接…

AI实战营:深度学习预训练与MMPreTrain

目录 一、MMPretrain算法库介绍 二、经典主干网络 残差网络ResNet(2015) Vision Transformer(2020) 三、自监督学习 四、多模态算法 一、MMPretrain算法库介绍 算法库与任务组成&框架概览 预训练工具箱MMPretrain Python推理API 环境搭建 O…

数据结构与算法·第4章【串】

串是有限长的字符序列,由一对单引号相括,如: “a string” 可以理解为c的 s t r i n g string string 基本操作 S t r A s s i g n , S t r C o m p a r e , S t r L e n g t h , C o n c a t , S u b S t r i n g StrAssign,StrCompare,StrLength,Conc…

大数据技术——使用IDEA开发Scala程序

目录 一、使用IDEA开发WordCount程序... 3 二、实验目的... 3 三、实验要求... 3 四、实验环境... 3 五、实验步骤... 3 4.1.1启动IDEA并创建一个新项目WordCount 3 4.1.2为WordCount项目添加Scala框架支持... 7 4.1.3数据准备... 8 4.1.4设置项目目录... 9 4.1.5新建…

webAPI学习笔记4——PC端网页特效

目录 1. 元素偏移量 offset 系列 1.1 offset 概述 1.2 offset 与 style 区别 offset style !!!!!!!案例:获取鼠标在盒子内的坐标 !!!!!&…

Jeston Orin Nnao 安装pytorch与torchvision环境

大家好,我是虎哥,Jeston Orin nano 8G模块,提供高达 40 TOPS 的 AI 算力,安装好了Jetpack5.1之后,我们需要配置一些支持环境,来为我们后续的深度学习开发提供支持。本章内容,我将主要围绕安装对…

OCR图片文字识别,人工手动图片标注软件安装过程

OCR图片文字识别,人工手动图片标注软件安装过程,本章关注标注软件的安装,启动过程 1. 下载 anaconda anaconda 下载慢的问题: 使用国内镜像地址下载: https://mirrors.bfsu.edu.cn/anaconda/archive/ https://www.ana…

OpenMMLab-AI实战营第二期——4.深度学习预训练与MMPretrain

文章目录 1. MMPreTrain算法库介绍1.1 算法库与任务组成1.2 框架概览 2. 经典主干网络2.1 ResNet2.2 Vision Transformer 3. 自监督学习3.1 SimCLR3.2 MAE3.3 iBOT 4. 多模态算法4.1 CLIP4.2 BLIP 视频链接:b站-深度学习预训练与MMPretrain 1. MMPreTrain算法库介绍…

NvM学习笔记(一)以TC387为例,分析为什么要使用Flash 模拟 EEPROM ?

在嵌入式软件系统中,管理非易失性的数据存储,如在系统启动时,从非易失性存储器中读取一些关键数据,在系统关闭阶段,同步应用程序RAM区的数据到非易失性存储器中,是一项十分必要的工作。 目前行业内用的最广…

Linux :: 时间日历指令【3】:cal 指令:查询当日是今年的第几天、输出当前月历、指定月历、输出当前年历、指定年历

前言:本篇是 Linux 基本操作篇章的内容! 笔者使用的环境是基于腾讯云服务器:CentOS 7.6 64bit。 学习集: C 入门到入土!!!学习合集Linux 从命令到网络再到内核!学习合集 目录索引&am…

Redis分段锁实现超高并发秒杀

参考尼恩著:《Java高并发核心编程》 技术自由圈 业务情景 还是秒杀场景,假设抖音直播间小杨哥上架6000单螺蛳粉,价格9.9买10包,限时1分钟秒杀,此时准备秒杀的人有1万人。我们首先从技术上来看看如果不进行优化是否可以…

控制四旋翼飞行器以进行多目标航点导航的MPC算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

信不信,3招就能测出你的网工水平

大家好,我的网工朋友 老话常谈一下,在网工这行发展,技术肯定是第一位的。 从你入行的第一步起,就很看重你的技术水平了,越往后,就更注重技术水平和项目经验的融合度。 再往后,技术要有&#…

网络安全实验室|网络信息安全攻防学习平台(脚本关1-6)

传送门: http://hackinglab.cn/ 1. key又又不见了 点击此处开启抓包,send ti repeater 模块 yougotit_script_now2. 快速口算 脚本来源: https://blog.csdn.net/hzxtjx/article/details/125692349 import requests,re# 自动处理cookies&a…

【PCB专题】案例:PCB封装中哪些禁布区我们最常容易忘记增加

USB等直插器件焊接面禁布区 USB器件面那大家都知道有座子有自己的Place_Bound。不同的器件如果Place_Bound重叠的话会报DRC。 但是因为器件是只在一个面上,另一个面是焊接脚,或是另一面不是焊接脚,但PCB封装上为通孔。比如有一些器件从PCB上看是通孔,但PCB Layout人员没见…

c#如何将数据缓存至Redis

环境准备 首先肯定是需要安装redis啦!这是我跑在docker的redis,和安装在本地的是 一样的效果 可视化工具Redis Desktop Manager。 使用方法 第一步,安装nuget包 Microsoft.Extensions.Caching.StackExchangRedis 创建一个asp.net.core项目…

Ubuntu20.04 终端打开不了的问题排查

Ubuntu20.04 终端打开不了的问题排查 今天用virtualbox安装了ubuntu20.04 问题:右键打开终端,怎么也打开不了! 点了也没反应,或者鼠标转小圈圈,然后也没有反应… 解决方法: 1、Ctrl Alt F6 先切换到终…

ChatGPT:求求你憋再问我关于C++多态的任何问题了...

文章目录 💐专栏导读💐文章导读🌷多态在继承中的表现🌺虚函数的重写🌺虚函数重写的两个例外🏵️1.协变🏵️2.析构函数的重写 🌺C11 override 和 final关键字🏵️final&am…

msvcr110.dll丢失怎么修复

msvcr110.dll是Microsoft Visual C 2012 Redistributable的一部分,它是一种动态链接库(DLL),旨在存储许多Microsoft Visual C应用程序共享的功能。这些功能包括数学运算、字符串处理、内存分配和释放等。它在Windows操作系统中起着…