数据结构:环形链表的实战指南

✨✨小新课堂开课了,欢迎欢迎~✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:http://t.csdnimg.cn/oHJAK(数据结构与算法)

小新的主页:编程版小新-CSDN博客

前言:今天我们主要从两个方面讲述环形链表,怎么判断是环形链表,以及如何如何找第一个入环的节点。

1.如何判断是否是环形链表

大家还记得如何找一个链表的中间节点吗?我们来回顾一下吧。

其中一种实现方法就是用的快慢指针,快指针每走两步,慢指针就走一步,当快指针对应的节点或者下一个节点为空时,慢指针指向该链表的中间节点。

 这个是单链表的情况,如果这个链表是带环链表的话,快,慢指针都会进环。那么就会上演一场快,慢指针的追击大赛。如果追上就说明该链表带环,不然的话就像上面的单链表一样,还没有开始追就结束了。

小新:快,慢指针在环内一定会相遇吗?有没有刚好错过的可能?

           如果slow走一步,fast走3,4……n步呢,结果又会怎样?

下面我们就来解答这个疑问。

能不能追上,还需我们进一步的证明。

说明当fast走两步,slow走一步是能相遇的,刚好能证明该链表是一个带环链表。

那接下我们看fast走3步,slow走1步的情况。

 如果fast走4步,slow走一步

讨论方法还是像上面的一样,这样讨论下去是非常麻烦的。

根据上面的证明已经得出了一个结论: 当N时奇数,C是偶数时是永远追不上的,我们只需讨论有没有这种情况存在即可。

显然N是奇数,C是偶数的情况不存在 ,永远追不上的条件不成立,如果是带环链表的话是一定能追上的。

总结:当快指针走n步,慢指针走一步时,在带环链表中一定能相遇,与环的大小等其他因素有一定关系,但主要结论仍然成立。具体来说,虽然环的大小等因素会影响相遇的时间和具体过程,但由于快指针相对慢指针的速度优势,它们最终还是会在环中相遇。只是可能需要经过更多的步数或绕环更多圈才能相遇。

环形链表只需用快慢指针去证明,在环形链表中快慢指针一定会相遇。

2.如何找到第一个入环的节点 

前面我们已经知道,快慢指针会在环形链表中相遇。

这个相遇的结论除了能证明链表是环形链表外,还能帮助找到的第一个入环的节点。

 这里以fast走2步,slow走一步为例。

3.实战练习 

示例1:判断是否为环形链表

代码实现:

bool hasCycle(struct ListNode *head) {
    struct ListNode* fast,*slow;
    fast=slow=head;
    while(fast && fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(fast==slow)
        return true;
    }

    return false;
}

示例二:找第一个入环节点

代码实现:

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode* fast, * slow;
fast = slow = head;
while (fast && fast->next)
{
    slow = slow->next;
    fast = fast->next->next;
    //相遇
    if (fast == slow)
    {
        struct ListNode* meet = slow;
        while (head != meet)
        {
            head = head->next;
            meet = meet->next;
        }
        return meet;
    }

}

return NULL;
}

 结束了~

下次还记得来哦

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式C语言教程:实现声音监测系统

声音监测在许多应用中都十分重要,如噪声控制、安全系统、和智能家居控制。 本教程将介绍如何在STM32微控制器上使用模数转换器(ADC)和声音传感器实现实时声音监测系统。 一、开发环境准备 硬件要求 微控制器:STM32F746NG&…

Unity技术学习:渲染大量物体的解决方案,外加RenderMesh、RenderMeshInstanced、RenderMeshIndirect的简单使用

叠甲:本人比较菜,如果哪里不对或者有认知不到的地方,欢迎锐评(不玻璃心)! 导师留了个任务,渲染大量的、移动的物体。 寻找解决方案: 当时找了几个解决方案: 静态批处…

使用STM32的FLASH保存数据

使用STM32的FLASH保存数据 为了防止“掉电丢失数据”,我们最先想到的是EEPROM,但是若考虑到降低成本和PCB布线的空间,使用CPU内部的FLASH空间来保存数据,是最好的选择。尤其是在STM32芯片上,应用案例还是比较多的。 …

GitHub搭建免费博客

一、GitHub仓库准备 ​ 搭建博客需要准备两个仓库。一个存放博客图床的仓库,另一个存放博客网站的仓库。 1.1、图床创建 新建仓库 第一步: ​ 第二步: 生成Token令牌 点击右上角头像->Settings->下拉,直到左侧到底&#…

【Word】写论文,参考文献涉及的上标、尾注、脚注 怎么用

一、功能位置 二、脚注和尾注区别 1.首先脚注是一个汉语词汇,论文脚注就是附在论文页面的最底端,对某些内容加以说明,印在书页下端的注文。脚注和尾注是对文本的补充说明。 2.其次脚注一般位于页面的底部,可以作为文档某处内容的…

原型模式类图与代码

现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。 采用原型模式(Prototype)来实现上述要求,得到如图 7.25 所示的类图。 原…

QT+多线程编程

QT的多线程编程有两种 1、自定义类继承QThread 第一种是自定义一个类继承于QThread,重写run()方法来实现。然后当需要使用线程的时候你就新建一个自定义对象,然后调用start方法开始运行。 下面的例子是widget里面创建一个线程,然后调用sta…

MySQL数据库练习——视图

schooldb库——utf8字符集——utf8_general_ci排序规则 先创建库,再去使用下列的DDL语句。 DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL COMMENT 创建时间,modifyDate datetime DEFAULT NULL …

电度表抄表是什么?什么叫电度表抄表?

一、电度表抄表的概念和作用 电度表抄表是电力系统中一个基本但非常重要的阶段。它指的是对安装在用户处电度表开展载入,记录下来电力消耗的值,便于测算电费的一个过程。此项工作不仅有利于供电公司精确扣除电费,都是监控和管理电力工程应用…

【Pytorch】4.torchvision.datasets的使用

什么是torchvision.datasets、 是pytorch官方给出的关于cv领域的训练数据集,我们可以用官方提供的数据集进行学习与训练 如何查看 我们可以进入Pytorch官网 切换一下版本到v0.9.0,就可以看到官方给出的数据集了 同时也有官方训练好的cv模型可以供我们…

Linux(openEuler、CentOS8)企业内网主备DNS服务器搭建

本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS类似&#xff0c;可参考本文&#xff09; 知识点 什么是DNS&#xff1a;DNS服务器&#xff0c;即域名服务器&#xff08;Domain Name Server&#xff09;&#xff0c;是进行域名和与之相对应的IP地址转换…

硬件工程师必读:10条职业发展黄金法则!

在快速发展的科技时代&#xff0c;硬件工程师作为推动技术创新和产业升级的重要力量&#xff0c;其职业发展之路既充满挑战也蕴含无限机遇。为了在这条道路上稳步前行&#xff0c;我们首先需要了解硬件产品的研发流程。 在这个过程中&#xff0c;公司内的每个岗位都发挥着不可或…

【机器学习】视觉基础模型的三维意识:前沿探索与局限

视觉基础模型的三维意识&#xff1a;前沿探索与局限 一、引言二、视觉基础模型的三维意识三、当前模型的局限性四、实验与结果五、总结与展望 大规模预训练的进展已经产生了具有强大能力的视觉基础模型。最近的模型不仅可以推广到任意图像的训练任务&#xff0c;而且它们的中间…

跨境电商日报:虾皮开设新物流中心;Tk Shop菲律宾调整佣金费率

2024年5月7日跨境电商日报目录&#xff1a; 1.Shopee开设新物流中心&#xff1b; 2.TikTok Shop菲律宾站调整佣金费率&#xff1b; 3.野莓海外仓卖家可以销售9公斤以上商品&#xff1b; 4.亚马逊一季度净销售额同比增长13%&#xff1b; 5.巴西对华二氧化钛启动反倾销调查 …

AI原生实践:测试用例创作探索

测试用例作为质量保障的核心&#xff0c;影响着研发-测试-发布-上线的全过程&#xff0c;如单元测试用例、手工测试用例、接口自动化用例、UI 自动化用例等&#xff0c;但用例撰写的高成本尤其是自动化用例&#xff0c;导致了用例的可持续积累、更新和迭代受到非常大制约。长久…

如何利用工作流自定义一个AI智能体

选择平台 目前已经有不少大模型平台都提供自定义智能体的功能&#xff0c;比如 百度的文心 https://agents.baidu.com/ 阿里的百炼平台 https://bailian.console.aliyun.com/。 今天再来介绍一个平台扣子&#xff08;https://www.coze.cn/&#xff09;&#xff0c;扣子是…

被忽略的C语言堆栈内存编程细节

没想到&#xff0c;评论区的一个提问&#xff0c;成了我知识的裂缝。&#x1f923; 前段时间解决了自己代码中的一个关于栈内存问题&#xff0c;便班门弄斧的写了一篇文章栈内存文章&#xff0c;没想到发出来很快便被大佬发现了其中一个问题&#x1f923;&#xff0c;在评论区里…

程序员的神器指南!揭秘软件开发必备工具

在软件开发的广袤海洋中&#xff0c;程序员们像是驾驶着帆船探索未知的航海者。他们面对的不仅仅是代码的挑战&#xff0c;还有项目管理、协作沟通和时间限制的压力。为了应对这些挑战&#xff0c;程序员们需要一系列强大的工具&#xff0c;就像是海中的指南针&#xff0c;帮助…

项目又延期了,怎么办?

Ada问&#xff1a;负责的几个版本上线都延期了&#xff0c;在测试环境出了问题&#xff0c;改过再测上线后&#xff0c;还是出问题。身为产品经理&#xff0c;很困惑&#xff0c;项目不断延期&#xff0c;又被打脸。怎么办&#xff1f; 学姐回答&#xff1a; 经理每天都是忙着…