今天的算法题目是如何判断一个单链表有环

数据结构与算法基本功:单链表是否有环,两种方式解决 背景 数据结构是我们程序员的基本功,无论是在日常工作还是在求职面试中都会经常用到;而且近年来程序员的工作竞争越来越大,数据结构和算法在大厂的面试中都成了必考题。我所了解的:华为技术人员招聘必须先通过机试才能获得面试机会,机试为两道数据结构编码题,每道题200分总分400,240分可通过。字节跳动面试考察算法是出名了的,不必多说。我所经历的美团面试也都考察了数据结构和算法。 由于我们的日常开发工作往往集中在业务逻辑代码的编写,并且运行在Spring等优秀的框架之上,JDK的数据结构虽然熟练使用,但是对于底 阅读详情

类似于追及问题创建两个指针,p2每一步走两个,p1每一步走一个

在这里插入图片描述
画的有点丑,如图,如果有环的情况下,最终他们会相遇
那么代码如下

#include <iostream>
using namespace std;
typedef struct LNode
{
    int data;
    struct LNode* next;
}LinkNode;

bool Is_Circle(LNode *head)
{
    LNode* p1 = head;
    LNode* p2 = head;
    while (p2 != NULL && p2->next != NULL)
    {
        p1 = p1->next;
        p2 = p2->next->next;
        if (p1 == p2)
            return true;
    }
    return false;
}
int main()
{
    LinkNode* L1,*L2,*L3,*L4,* L5, * L6, * L7;
    L1=(LinkNode*)malloc(sizeof(LinkNode));
    L2 = (LinkNode*)malloc(sizeof(LinkNode));
    L3 = (LinkNode*)malloc(sizeof(LinkNode));
    L4 = (LinkNode*)malloc(sizeof(LinkNode));
    L5 = (LinkNode*)malloc(sizeof(LinkNode));
    L6 = (LinkNode*)malloc(sizeof(LinkNode)); 
    L7 = (LinkNode*)malloc(sizeof(LinkNode));
    L1->data = 5;
    L2->data = 3;
    L3->data = 7;
    L4->data = 2;
    L5->data = 6;
    L6->data = 8;
    L7->data = 1;
    L1->next = L2;
    L2->next = L3;
    L3->next = L4;
    L4->next = L5;
    L5->next = L6;
    L6->next = L7;
    L7->next = L4;
    cout<<Is_Circle(L1);
    return 0;
}

问题延伸 1:如果链表有环,如何求出环的长度
解法,当两个指针首次相遇,证明有环,再次相遇就是环的长度,因为p2比p1多走了一倍路程

#include <iostream>
using namespace std;
typedef struct LNode
{
    int data;
    struct LNode* next;
}LinkNode;

int Is_Circle(LNode *head)
{
    int count=0;//用来记录步数
    LNode* First_encounter=head;
    LNode* Second_encounter= head;
    LNode* p1 = head;
    LNode* p2 = head;
   
    while (p2 != NULL && p2->next != NULL)
    {
        p1 = p1->next;
        p2 = p2->next->next;
        if (p1 == p2)
        { 
            First_encounter = p1;      
            Second_encounter = p2;
        }
        break;
    }
   
    while (First_encounter != NULL && First_encounter->next != NULL)
    {
        count++;
        First_encounter = First_encounter->next;
       Second_encounter = Second_encounter->next->next;
        if (First_encounter == Second_encounter)
            break;     
    }
           return  count;
}
int main()
{
    LinkNode* L1,*L2,*L3,*L4,* L5, * L6, * L7;
    L1=(LinkNode*)malloc(sizeof(LinkNode));
    L2 = (LinkNode*)malloc(sizeof(LinkNode));
    L3 = (LinkNode*)malloc(sizeof(LinkNode));
    L4 = (LinkNode*)malloc(sizeof(LinkNode));
    L5 = (LinkNode*)malloc(sizeof(LinkNode));
    L6 = (LinkNode*)malloc(sizeof(LinkNode)); 
    L7 = (LinkNode*)malloc(sizeof(LinkNode));
    L1->data = 5;
    L2->data = 3;
    L3->data = 7;
    L4->data = 2;
    L5->data = 6;
    L6->data = 8;
    L7->data = 1;
    L1->next = L2;
    L2->next = L3;
    L3->next = L4;
    L4->next = L5;
    L5->next = L6;
    L6->next = L7;
    L7->next = L4;
    cout<<Is_Circle(L1);
    return 0;
}

问题延伸 2 如何判断入环节点
在这里插入图片描述
指针p1一次只走一步,所走的距离是D+S1
指针p2一次只走二步,所走的距离是D+S1+n(s1+s2)
所以p2比p1的路程多走一倍
2(D+S1)=D+S1+n(S1+S2)
D=(n-1)(S1+S2)+S2
所以入环那段距离等于首次相遇点再走s2
此时把一个点放回开始处,两个点同时走一步,那么相遇点就是入环点了

#include <iostream>
using namespace std;
typedef struct LNode
{
    int data;
    struct LNode* next;
}LinkNode;

int Is_Circle(LNode *head)
{
    int count=0;//用来记录步数
 
    LNode* p1 = head;
    LNode* p2 = head;
   
    while (p2 != NULL && p2->next != NULL)
    {
        p1 = p1->next;
        p2 = p2->next->next;
        if (p1 == p2)
        break;
    }
    p1 = head;
    while (p1 != p2 && p1 != NULL)
    {
        p1 = p1->next;
        p2 = p2->next;
    }
    return p2->data;
}
int main()
{
    LinkNode* L1,*L2,*L3,*L4,* L5, * L6, * L7;
    L1=(LinkNode*)malloc(sizeof(LinkNode));
    L2 = (LinkNode*)malloc(sizeof(LinkNode));
    L3 = (LinkNode*)malloc(sizeof(LinkNode));
    L4 = (LinkNode*)malloc(sizeof(LinkNode));
    L5 = (LinkNode*)malloc(sizeof(LinkNode));
    L6 = (LinkNode*)malloc(sizeof(LinkNode)); 
    L7 = (LinkNode*)malloc(sizeof(LinkNode));
    L1->data = 5;
    L2->data = 3;
    L3->data = 7;
    L4->data = 2;
    L5->data = 6;
    L6->data = 8;
    L7->data = 1;
    L1->next = L2;
    L2->next = L3;
    L3->next = L4;
    L4->next = L5;
    L5->next = L6;
    L6->next = L7;
    L7->next = L4;
    cout<<Is_Circle(L1);
    return 0;
}
U2Net网络实战:从原理到代码实现(附背景去除应用) 本文深入解析了U2Net网络的原理与代码实现,重点剖析了其独特的嵌套U型结构(RSU模块)和显著图融合机制。通过实战演示,指导读者如何加载预训练模型并应用于精准的图像背景去除任务,为电商、摄影等领域提供高效的自动化抠图解决方案。 阅读详情

相关推荐

从淬火实验到仿真验证:用ANSYS APDL复现钢球冷却温度变化(含动画生成教程)

本文详细介绍了如何利用ANSYS APDL进行淬火过程的瞬态热分析仿真,以复现钢球冷却温度变化。内容涵盖从实验数据校准材料参数、构建高保真模型、设置非线性瞬态求解,到提取节点温度曲线和生成温度云图动画的全流程。通过APDL命令流实现自动化,为工程研发和学术研究提供高效、可靠的仿真验证方法。

pz8901234的博客 791

如何判断链表是否有环

给定一个单链表,判断其中是否有环,已经是一个比较老同时也是比较经典的问题,在网上搜集了一些资料,然后总结一下大概可以涉及到的问题,以及相应的解法。 首先,关于单链表中的环,一般可能涉及到以下几个问题:   1、给一个单链表,判断其中是否有环的存在;   2、如果存在环,找出环的入口点;   3、计算环的长度; 下面,我将针对上面这几个问题一一给出解释。 1、判断时候有环(链表头指针为head)   对于这个问题我们可以采用 “快慢指针” 的方法。就是有两个指针 fast 和 slow,开始

心本逍遥灬 1万+

CST实战:5分钟搞定圆极化天线轴比分析(含远场设置技巧)

本文提供了一份CST Studio Suite圆极化天线轴比分析的实战指南。文章详细讲解了轴比的概念与工程标准,并重点演示了如何正确设置远场监视器以获取Axial Ratio数据,包括关键步骤与后处理技巧。最后,通过植入式天线在生物组织环境中的案例,分析了复杂环境对轴比性能的影响及优化思路。

nokia的博客 993

如何判断链表有环

如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现“环”,就像题图这样。如何用程序判断出这个链表是有环链表? 不允许修改链表结构。 时间复杂度O(n),空间复杂度O(1)。方法一、穷举遍历 方法一:首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新节点之前的所有节点当中存在...

少年夜雨行的专栏 7283

基于Python实现的捕鱼达人小游戏源代码+使用说明

摘要: 本文介绍了一款自制的捕鱼达人小游戏,使用Python3和Pygame模块开发。游戏包含完整的资源文件(图片、音效、字体)和源码结构(11个功能模块),实现了大炮移动射击、特殊子弹、炸弹、难度递增等核心玩法。安装需配置Python环境和Pygame模块,运行main.py即可启动游戏。游戏支持键盘控制(方向键移动、空格射击、1键放炸弹),默认时长600秒,包含开始菜单、游戏界面和结束界面。所有代码均有详细注释,项目已开源并提供下载链接。(150字)

2301_76484015的博客 664

Rstudio安装org.Hs.eg.db

自己也是个小白,初次安装org.Hs.eg.db碰到好多问题,步骤总结如下: 第一,instal.packages()安装,不行则换 BiocManager::install() 第二,如BiocManager不成,说明不是最新版本,可按提示安装最新版 BiocManager::install(version = '3.13') #由于R版本较新,按照提示中的相关信息,安装最新版本的 第三,再次安装 BiocManager::install("org.Hs.eg.db") 第四,之后每个人.

ZH_DDong的博客 2万+

【算法】如何判断链表有环

如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现“环”,就像题图这样。如何用程序判断出这个链表是有环链表? 不允许修改链表结构。 时间复杂度O(n),空间复杂度O(1)。 方法一、穷举遍历方法一:首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新

Mlib 8万+

OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战

【代码】OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战。

m0_67505153的博客 187

经典链表问题——判断链表是否带环

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

fight_for1的博客 1663

【深度学习新浪潮】算力上太空:NVIDIA Space-1 Vera Rubin Module 深度技术解析

NVIDIA Space-1 Vera Rubin Module 不只是一款芯片模组,它是天地一体化 AI 的基础设施底座。它用成熟的 GPU 架构 + 航天级加固,把地面 AI 生态直接平移到太空。下一个 AI 创新战场,不在云端,而在轨道。在轨 LLM星上多模态实时处理卫星自主组网与分布式推理太空算力成为云计算的一级节点参考资料NVIDIA 官方博客:NVIDIA 推出太空计算,将 AI 送入太空轨道GTC 2026 黄仁勋主题演讲。

专注:太空算力、AI infra、异构调度、大模型成本工程 1124

Open3D 合并两个点云【2025最新版】

两个点云中的数据连接,博客长期更新,本文最新更新时间为:2025年4月26日。

点云侠的博客 7435

如何判断链表有环(三种方法)

方法一、穷举遍历 方法一:首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就从头节点重新遍历 新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新节点之前的所有节 点当中存在相同节点ID,则说明该节点被遍历过两次,链表有环;如果之前的所有节点当中不存在相同的 节点,就继续遍历下一个新节点,继续重复刚才的操作。 例如这样的链表:A->B->...

WangY.H 1万+

9、储备池学习:从学习到学习的新范式

本文探讨了基于学习到学习(L2L)框架的储备池计算新范式,提出通过在外循环中优化储备池的超参数(如递归连接权重、输入权重和读出初始化),以提升其在多种任务中的内循环学习性能。研究展示了两种主要实验设置:一是优化储备池用于回归二阶Volterra滤波器任务,显著优于随机基线;二是实现无需调整读出权重、仅依赖内部动态学习非线性函数的能力,表明储备池可快速构建目标函数的内部模型并安装任务先验知识。结合流程图与表格,文章系统呈现了L2L的训练流程、技术细节及实验结果,并讨论了性能提升、泛化能力等开放问题,指出了未来

ujm56789012的博客 501

判断单链表是否有环,如何寻找环的入口结点

今天我们来讨论一个有趣的链表问题,判断链表是否有环,如果有环,环的入口结点如何寻找? 文章目录1. 如何判断一个单链表是否有环呢? 1. 如何判断一个单链表是否有环呢?

张凯 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

图解算法:确定单链表有环,如何找到环的入口和长度?

一、序 本文继续給大家带来一道和单链表相关的算法题。 之前聊到,如何对单链表是否存在环进行检测(戳我了解),今天再来聊聊这个问题的进阶题: 一个单链表,如果有环,求环的入口。 一个单链表,如果有环,求环的长度。 链表这种结构,可以通过「指针」,将一组零散的内存块串联起来。那单链表,如果有环是一个什么情况? 如上图所示,单链表中如果存在环,一定有且只有一个入口点,进...

承香墨影的博客 5198

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

如何判断一个单链表是否有环以及环入口

这是一个在我们学习数据结构的时候经常会遇到的问题,今天给大家带来这个问题的几种解法。 方法一 最容易想到的办法就是遍历单链表,如果单链表有环的话那么会进入死循环,但是我们不知道单链表的长度,所以如果单链表长度很长,我们一直向下遍历,也无法分辨出是单链表还没遍历完还是进入了死循环。 所以这种解法不靠谱。 方法二 我们可以在遍历单链表中的每个元素的时候,每遍历一个新的节点,就从头再开...

lebronchen的博客 8700

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java判断单链表是否有环

算法和数据结构是面试考核的重点,其中经常问到单链表的问题,比如单链表的逆置、判断单链表是否有环等问题,这些主要考察的程序员的基本代码能力,今天给大家一起学习一下如何判断单链表是否有环。 那么如何判断一个单链表是否有环呢?(这个好像是谷歌的面试题目)先说一下算法思想: 我们可以设置两个指针分别叫做slow和fast,遍历这个链表,其中让slow指针每次走一步,而fast指针则每次走两步。大家想一...

qq_22595041的博客 2517

算法面试题:如何判断单链表中是否存在环

题目分析 一道算法面试题:判断单链表是否存在环。 我们知道单链表中结点都是一个结点指向下一个结点这样一个一个链接起来的,直到尾结点的指针域没有指向,单链表就到此结束了。 这里存在环的意思就是,尾结点的指针域并为空,而是指向此单链表的其他结点,这样就形成环了,这样遍历单链表就死循环了因为破坏了结束条件。 前面我们算法面试题 快速找到单链表中间节点 所用的快慢指针,同样可以用来判断是否存在环,

重庆李四 1万+

阿粉教你这样解锁单链表环的操作

临近假期,很多人都放松了学习,阿粉一阵激动,这可是超越别人的好机会啊,赶紧去补一补数据结构和算法方面的内容。今天阿粉教你这样解锁单链表环的操作,让你面试手写代码再也不怕!说到单链表,肯定...

Java极客技术 660

判断单链表是否有环(Java实现)

给定一个链表,判断链表中是否有环的几种方法 今天刷LeetCode刷到一道这样的题,详情参见(https://leetcode-cn.com/problems/linked-list-cycle/) ADT: class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = n...

weixin_43695091的博客 1万+

如何判断单链表中是否有环?如何找到环中的起始节点

今天在leetcode上做了一道题:

笨鸟的专栏 1840

循环首次适应算法_图解算法:确定单链表有环,如何找到环的入口和长度?

一、序本文继续給大家带来一道和单链表相关的算法题。之前聊到,如何对单链表是否存在环进行检测,今天再来聊聊这个问题的进阶的题:一个单链表,如果有环,求环的入口。一个单链表,如果有环,求环的长度。链表这种结构,可以通过「指针」,将一组零散的内存块串联起来。那单链表,如果有环是一个什么情况?如上图所示,单链表中如果存在环,一定有且只有一个入口点,进去了就别想出来,接下来我们看看如何找到这个环的入口。二、...

weixin_39617685的博客 624

单链表形成环 java_[数据结构与算法]07 关于单链表环的操作( Java 版)

单链表经典操作,第一个是单链表反转,在这篇文章中已经写过了:[数据结构与算法]04 Link List (链表)及单链表反转实现,第二个是判断链表中是否有环,也就是今天这篇文章想要说的.判断链表是否有环如图,我们能够清楚看到,这个链表是有环的.咱们一起来分析一下判断链表中是否有环,可以从头结点开始,依次遍历单链表中的每一个节点.每遍历一个节点,就和前面的所有节点作比较,如果发现新节点和之前的某个节...

weixin_29080843的博客 192

[数据结构与算法]07 关于单链表环的操作( Java 版)

单链表经典操作,第一个是单链表反转,第二个是判断链表中是否有环.

自由而不独立,仍是奴隶。 585

链表有环的判断

问题 今日一问:我们知道,在一个链表里,如果某一个节点的next属性指向了链表的另一个节点,那么这个链表就是有环的。 那么今天的问题是:如何判断一个单链表是有环的。一个有环的链表会给程序带来什么样的隐患。 提示:你可能会想到在链表里选取一个节点,然后对链表进行循环,如果循环到了这个节点就说明链表有环了,但是这个办法的问题是如何确保选取的节点在链表里,如果有办法确定这点,实际上就相当于判断了链表是否...

u014068277的博客 259

判断两个单向链表是否存在环

今天Mayuyu来带领你们讨论如下三个问题:    (1)如何判断一个单链表是否存在环 ?  (2)如果存在环,如何找到环的入口点?  (3)两个链表中有环时,如何判断相交?     问题一   我们设置两个指针,分别是fast和slow,初始都指向这个单向链表的表头,fast每次走两步,而slow每次走一步, 所以,我们知道如果有环,那么fast先进入环,slow后进入环,在

渡辺麻友 1224
上一篇: 617. 合并二叉树
下一篇: 如何用JAVA写一个ATM 自动取款机
凌晨里的无聊人
博客等级 码龄8年 2320粉丝 206原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨里的无聊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值