判断链表是否有环并找到环的入口

【面试题】-判断单链表是否有环并找到环入口(快慢指针) 快慢指针 所谓的快慢指针的快慢是指指针向前移动的步长。比如在单链表中,快指针每次向前移动2个步长,慢指针则每次向前移动1个步长。 单链表环 单链表有环的定义是链表的尾节点指向了链表中间的某个结点。比如下图。 阅读详情

    本篇博客给出的解法都是在O(1)的空间复杂度内解决问题,O(n)则可直接使用字典将遍历到的链表的结点存储下来,问题迎刃而解。

判断是否有环 141. 环形链表

在这里插入图片描述
    例如上图这样的一个链表,图中的链表是存在环的,一种解决方法就是使用快慢指针,使用两个指针,均从head出发,慢指针每次走一步,快指针每次走两步,如果链表中存在环则在快慢指针一定会在某个时刻相遇。
     为什么一定会相遇?当两个指针都进入环后,快指针每次都比慢指针多走一步,一开始两个指针间存在距离a,当之后多走的步加上a刚好等于环的长度时则两个指针就一定会相遇。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head == NULL || head->next == NULL)
            return false;
        ListNode* fast, *slow;
        fast = slow = head;
        while(fast != NULL && slow != NULL){
            slow = slow->next;
            fast = fast->next;
            if(fast != NULL)
                fast = fast->next;
            if(fast == slow)
                return true;
        }
        return false;
    }
};
找到环的入口 142. 环形链表 II

    解题思路稍微有点复杂,首先将上面的判断是否有环的函数的返回值修改为返回环中的某个节点的指针,得到环中任意一个节点的指针后即可得到环中的节点的数量,得到在环中的节点的数量(设为n)后再使用两个指针p1,p2,让p2先走n步,然后p1,p2保持相同的速度走,最后相遇的节点就是环的入口,这样p2一直领先与p1 n步,当p1走到环的入口时p2肯定也刚好走到环的入口。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* hasCycle(ListNode *head) {
        // 有环则返回环中的任意一个节点的指针,否则返回空
        if(head == NULL || head->next == NULL)
            return NULL;
        ListNode* fast, *slow;
        fast = slow = head;
        while(fast != NULL && slow != NULL){
            slow = slow->next;
            fast = fast->next;
            if(fast != NULL)
                fast = fast->next;
            if(fast == slow)
                return slow;
        }
        return NULL;
    }

    int cycleLen(ListNode* head){
        // 有环则返回环的节点的个数,否则返回0
        ListNode* p = hasCycle(head);
        if(p == NULL)
            return 0;
        ListNode* copyP = p;
        p = p->next;
        int cnt = 1;
        while(p != copyP){
            ++cnt;
            p = p->next;
        }
        return cnt;
    }

    ListNode *detectCycle(ListNode *head) {
        if(head == NULL || head->next == NULL)
            return NULL;
        int cycleNodeNum = cycleLen(head);
        if(cycleNodeNum == 0)
            return NULL;
        ListNode* p1, *p2;
        p1 = p2 = head;
        while(cycleNodeNum > 0){
            p1 = p1->next;
            cycleNodeNum--;
        }
        while(p1 != p2){
            p1 = p1->next;
            p2 = p2->next;
        }
        return p1;
    }
};
如何判断链表中是否有环 今天面试被问住了,很惭愧啊,回来上网查了一下思路。自己写了点程序。 1.如何判断是否有环?如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈。 2.如何计算环的长度?第一次相遇(超一圈)时开始计数,第二次相遇时停止计数。 3.如何判断环的入口点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接 阅读详情

相关推荐

基于51单片机的通讯聊天系统

通过编写51单片机通讯聊天程序,掌握51单片机的各个模块的知识点和运用C语言编写51单片机的能力。用51单片机与口袋开发板设计实现一个单片机与电脑串口助手实现通讯功能的程序。程序的主要功能如下: 1 OLED初始化显示Welcome to Bluetooth communication! 字符串。 2 程序开始时处于接收信息模式, 电脑串口助手发送信息时,将从初始化字符第一个开始显示,电脑串口助手发送信息后,蜂鸣器响铃2秒左右。 3 每次同时按下左右键时,可以轮流切换接收/发送信息模式 4 在发送信息模式时

m0_47419053的博客 3638

判断链表中是否有环并找出环入口位置

本章只对单向链表做出示例。

black_sharkF的博客 2145

智驾域控制器硬件架构:从接口丛林到算力核心的工程解码

本文深入解析了智驾域控制器硬件架构的设计挑战与工程实践。面对复杂的接口丛林,文章详细探讨了如何高效融合摄像头、雷达等多源传感器数据,并构建以多SOC为核心的强大算力平台。同时,文章强调了电源、时钟、散热等最小系统及车规级可靠性设计的关键作用,为工程师提供了从接口驯服到算力核心协同的完整硬件解码指南。

happy2的博客 482

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

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

承香墨影的博客 5198

KEPServerEX 6 之驱动协议(UDD)实战 HTTP协议对接OpenWeatherMap天气 API全流程指南

本文分享了基于 KEPServerEX 6 的通用设备驱动(UDD)对接OpenWeatherMap天气API的实战方案。该方案针对工业物联网场景进行了深度优化,具有动态城市切换、运行时热配置、老旧JS引擎兼容等核心特性。文章详细介绍了从环境准备、脚本部署到Tag配置的全流程,重点解析了Legacy JS语法适配、Float类型安全处理等关键实现细节,并提供了完整的避坑指南和故障排查方法。该方案经过生产环境验证,可稳定实现气象数据采集与动态切换功能,适用于SCADA/MES系统集成场景。

-雲飛兄-博客 713

基于 Google Colab 的 mask rcnn 训练自己的数据集(以实例分割为例)

详细步骤1 数据集的制作1.1 数据标注1.2 生成数据集2 环境的搭建2.1 搭建流程2.2 注意事项(报错)3 开始训练4 可视化4.1 修改webcam.py文件4.2 进行可视化5 参考文章 1 数据集的制作 1.1 数据标注 使用 labelme=4.5.6 版本进行标注,标注文件指定到保存图片的路径下,也就是json文件和jpg文件放在同一个文件夹里 1.2 生成数据集 先手动划分训练集和测试集(包括图像和标注文件),然后分别整合它们的标注信息,参考代码:1_ships_to_coco.py

G果的博客 8002

寻找环形链表的环入口点的三种方法

链表环检测与入口查找方法摘要 本文系统阐述了检测链表环及定位环入口的四种算法。1.快慢指针法:通过双指针速度差判断环存在,利用数学推导L=nC-x的关系精确定位入口点,时空复杂度分别为O(N)和O(1)。2.链表拆分法:将环形链表转化为两个相交链表问题,通过找交点确定入口。3.哈希表法:用集合记录访问节点,首次重复节点即为入口,空间复杂度O(N)。4.方法对比:快慢指针空间最优但逻辑复杂,哈希表最简单但耗内存,链表拆分法展示问题转化思路但会修改原结构。各方法适用场景不同,快慢指针适合内存受限场景,哈希表适用

2401_89278589的博客 1155

RT-DETR算法优化改进:Backbone改进 | HGBlock完美结合PPHGNetV2 GhostConv

GhostConv助力RT-DETR ,HGBlock与PPHGNetV2 GhostConv完美结合

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 2909

通俗易懂的告诉你如何判断链表中是否有环并找出环的入口位置

假如一个链表中存在环,那么可以利用哈希法和双指针法来判断是否存在环,同时,利用三指针就可以找到环的入口位置

zwx900102的博客 3714

066、AR 应用中虚拟物体漂移抖动?IMU 融合 + 光流追踪的视觉里程计优化方案

AR应用中虚拟物体漂移抖动优化方案 摘要:针对AR应用中虚拟物体漂移抖动问题,提出一种IMU融合与光流追踪的视觉里程计优化方案。关键点包括:1) 采用IMU预积分技术处理高频噪声,通过中值积分计算帧间相对运动约束;2) 使用金字塔LK光流追踪像素运动,通过中值偏差法剔除异常值;3) 构建10帧滑动窗口的紧耦合优化框架,将IMU预积分约束和光流重投影约束联合优化。实验表明,该方法有效解决了时间戳未对齐导致的"跳舞箭头"现象,在手机端实现稳定30fps的AR定位精度,漂移误差降低至厘米级。特别提醒:IMU与视觉

ai技术增长的博客 161

基于ZYNQ PL的AD7606数据采集与FFT实时频谱分析:从硬件到创新实现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kKnmpgJm-1750295287594)(https://example.com/fft_plot.png)]本文涉及代码已在Xilinx ZCU102开发板与AD7606评估板上验证通过,采样率支持200KSPS@8通道,FFT计算延迟<1ms。传统MCU+DSP方案难以兼顾速度与功耗,而ZYNQ的PL+PS架构为这一问题提供了完美解决方案。本文实现的ZYNQ PL方案突破了传统处理器的性能瓶颈,通过。

QQ_778132974的博客 339

判断单链表是否有环并找到环的入口等问题

判断单链表是否有环并找到环的入口等问题 假设一个单链表有环,他就是下面的这种情况: 我们有下面几个问题: 1.给一个单链表,判断其中是否有环的存在; 2.如果存在环,找出环的入口点; 3.如果存在环,求出环上节点的个数; 4.如果存在环,求出链表的长度; 对于这些问题有一种方法就是...

weixin_42078660的博客 7776

三模冗余、纠错编码、单粒子翻转防护

本文探讨了高可靠性FPGA系统设计的三大关键技术:三模冗余(TMR)、纠错编码(ECC)和单粒子翻转(SEU)防护。TMR通过三个并行模块和表决器实现容错,但会增加硬件资源和功耗;ECC利用汉明码等编码方式检测和纠正数据错误,适用于存储器保护;SEU防护则针对高能粒子引发的位翻转问题,采用配置刷新、TMR和ECC等方法。文章还通过Verilog代码示例展示了这些技术的实现,并提出了一个综合应用案例,结合三种技术构建高可靠性控制系统。这些技术在航空航天、医疗设备等关键领域具有重要应用价值。

2301_79143213的博客 715

141、142 判断链表是否有环,并找到环的入口

141 判断链表是否有环 点击此处返回总目录 142 判断链表是否有环,如果有环,则返回环的入口节点 ...

liupc的学习笔记 290

STM32F407中文手册

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

判断链表中是否有环,并找到环的入口点!

判断链表中是否有环,并找到环的入口点! 思路:首先判断有环的思路:设定快慢指针slow、fast,快指针一次走两步,慢指针一次走一步,若链表中存在环,则两个指针必定相遇。其次,注意链表判空的条件问题。 找到环后,再设定一个p指向头指针,遍历一遍链表,同时slow从fast.next开始遍历一遍整个环,若等于p,那么p就是环的入口点。 public static ListNode EntryNo...

Cheng_MY的博客 322

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

五、判断单链表是否有环,并找到环的入口点

(原理参考:https://www.jianshu.com/p/ef71e04241e4) /*判断链表有环,并返回环的入口点*/ struct list_head *find_loop_point(struct list_head *head) { struct list_head *slow = head; struct list_head *fast = head; ...

Uaena的博客 351

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

判断单链表是否有环并找到入口处以及判断两个单向链表是否相交

判断一个单链表是否有环一般有两种解法,第一种就是

chq454168044的专栏 523

链表--如何检测一个链表是否有环及如何找到环的入口点

如何检测一个链表是否有环 有环的链表: 有环的链表是指链表有环路,例如A-&amp;gt;B-&amp;gt;C-&amp;gt;D-&amp;gt;E-&amp;gt;F-&amp;gt;B,遍历的时候B-&amp;gt;C-&amp;gt;D-&amp;gt;E-&amp;gt;F-&amp;gt;B会形成环路一直循环。 思路: 设置一个快指针fast,一个慢指针slow,二者初始都指向链表头,fas

yangruxi的博客 1万+

【链表】【证明】快慢指针判断链表有环、寻找环入口、计算环大小的原理

问题:         给定一个链表:         1. 判断链表是否有环。         2. 如果链表有环,请找出环入口。         3. 计算环的大小。 思路:快慢指针         分别定义一个快指针fast和慢指针slow,快指针一次走两步,慢指针一次走一步。如果链表没有环,那么fast最终会指向nullptr;如果链表有环,那么快指针和慢指针最终会相遇。所

donghuaan的博客 9106

判断一条链表上是否存在环

判断一条链表上是否存在环 方法一、简单粗暴的方法,两套循环遍历链表,查看是否存在相同的节点,如果有,则存在环;没有,则不存在环,时间复杂度O(n^2),面试官肯定不愿意看到这种解决方式。 是否存在时间复杂度为O(n)的算法求解该问题呢?有的有效的方法(内存开销更少的方法)是由Floyd提出的,所以该方法称为Floyd环判定算法。 方法二、该方法使用两个在链表中具有不同移动速度的指针。一旦它们...

凌凌小博客 2万+

链表の如何判断一个链表带环以及找到环的入口

对于链表的题目真的是超级多,想要每道题都弄懂其实不难,只要掌握方法,掌握思想,做好边界检查,弄清每道题的题意,那么就可以举一反三,也不那么容易写出崩溃的代码。对于如何判断一个链表带环这个问题,可以这样来分析它如图是一个带环的链表,首先可以使用两个指针同指向链表的第一个节点,其中一个叫slow,另一个叫fast。其次让slow这个指针每次走一步,fast每次走两步,图中每个指针旁边的数字代表它所走的...

hei我在这 1569

判断单链表是否有环

判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?    相关题目:  (1)找出单链表的倒数第 4个元素。找出单链表的中间元素。  (2)判断两个单链表是否相交,若两个单链表相交,计算相交点。  解题思路:  (1)判断是否有环。采用快慢指针的思路,一个指针一次移动一个结点,另一个指针移动两个结 点。  如果有环,则进入环后,快指针肯定可以追赶上慢指针,这样就会出现两

陈曦的专栏 1万+

判断单链表是否存在环,判断两个链表是否相交问题详解

有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如果找到环的入口点?解答:一、判断链表是否存在环,办法为:设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则f

ldong2007的专栏 6607

Leetcode(七)——给定一个链表 ,判断链表中是否有环。 返回环的入口。

给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。pos。仅仅是为了标识链表的实际情况。如果链表中存在环,则返回true。否则,返回false。true链表中有一个环,其尾部连接到第二个节点。true链表中有一个环,其尾部连接到第一个节点。false链表中没有环。

m0_74862890的博客 1123

链表--判断是否有环,并给出环的入口链表

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 分析: 此问题包含两个步骤: (1)判断链表中是否有环 (2)找出环 一、 选择快慢指针,让快指针每次走两步,慢指针每次走一步,若是单链表中有环的话,那么两个指针会相遇,此时可返回其在环中的相遇点。 二、 1)当相遇的时候,设慢指针在环中走了k步,设环之外的部分长为x,环的长度为c,则快指针一共走了 x+m1*c+k步,(m1为快指针在环中走的圈数),慢指针一共走了x+m2*c+k(m2为快指针在环中走的圈数).

weixin_42145502的博客 261
上一篇: 高质量代码篇——代码的完整性
下一篇: 神经网络优化和优化算法要点总结
philpanic9
博客等级 码龄9年 44粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值