【数据结构】有关环形链表题目的总结

文章目录

  • 引入 - 快慢指针
  • 思考 - 快慢指针行走步数
  • 进阶 - 寻找环形链表的头


引入 - 快慢指针

141-环形链表 - Leetcode
在这里插入图片描述
关于这道题,大家可以利用快慢指针,一个每次走两步,一个每次走一步,只要他们有一次相撞了就代表说这是一个链表
为了更好的理解我们可以代入下图
在这里插入图片描述
我们假设slow进环的时侯,fast已经走了C(环形区域的总长度)-N步了,那么它就距离slow刚刚好N步于是乎没进行一次移动,即fast往前走2步,slow往前走一步,那么它们之间的距离就是N-1步以此类推直到0
在这里插入图片描述
所以这一题的解答代码就是

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {if(head == NULL)return false;ListNode *fast = head, *slow = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(slow == fast)return true;}return false;
}

思考 - 快慢指针行走步数

根据上面快指针一次走步,慢指针一次走一步,我们可以得到结果并知晓原理

但如果快指针一次走的是步呢,结果还会一样吗。
为此,我们不妨罗列一下三步的情况

假设一次走三步,我们在不分 C(环形区域的总长度) 的情况下,它们之间的距离就会是N -> N-2 -> N-4 -> …
因为不分奇偶就无法得出最后结果,所以我们可以得到下面这个分类讨论

即:
在这里插入图片描述
我们发现一旦 C(环形区域的总长度) 为奇数的话,就会导致最后快指针比慢指针多走了一步,这就会导致,追不上吗,
但真的会这样吗

大家肯定会反应过来, C(环形区域的总长度) 的总长度是不会变的,变得只是快慢指针之间的距离,如果在进行一次循环我们可以将 N 的初始值看成 C-1 了,而N每次移动都需要 -2,并且 C 为奇数,因此这一次,就可以看成偶数的这种情况了,这样就能抓到了
在这里插入图片描述
同样的我们如果将这种情况以数学公式表示
在这里插入图片描述
在这里插入图片描述

这是快指针步数为3的情况,为4,为5的讨论情况也差不多这样,无非就是再讨论一下,这里就不赘述了


进阶 - 寻找环形链表的头

142 - 环形链表Ⅱ - Leetcode
在这里插入图片描述
乍一看,这道题与上面一道题基本一样,但是细看我们会发现这里返回开始入环的第一个节点,所以还是需要思考

如果有环的话,创建两个指针,一个指针从head节点开始,另一个指针从相遇点meet开始,两个指针每次都走一步,两个指针相遇的点就是链表入环的第一个节点。

因此在上面引入那道题的基础上我们需要增进一步
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
即为L距离就等于meet在环中转x-1圈,再走C-N,所以说meet和head的相遇点一定是链表入环的第一个节点。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {if(head == NULL)return NULL;ListNode *fast = head, *slow = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(slow == fast){ListNode* phead = head;ListNode* meet = slow;while(phead != meet){phead = phead->next;meet = meet->next;}return meet;}}return NULL;
}

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

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

相关文章

Django实验(远程访问+图片显示)

众所周知,Python除了不能生孩子什么都会。Python也是可以做web服务的。 Python做web有一个重点优势是:做一个快速的AI Demo。 第一步:安装一个版本5.0以上django 第二步:构建咱们的Django工程,我取名为BBQ django-adm…

仅为娱乐,Python中如何重定义True为False?

在Python中,True 和 False 是内建的布尔常量,分别代表逻辑上的真和假。它们是不可变的,且在Python语言规范中具有特殊地位,不能被用户直接重定义。尝试给 True 或 False 赋予新的值是违反Python语言规则的,这样的操作会…

(论文阅读-优化器)Orca: A Modular Query Optimizer Architecture for Big Data

目录 摘要 一、简介 二、背景知识 2.1 大规模并行处理 2.2 SQL on Hadoop 三、Orca架构 四、查询优化 4.1 优化工作流 4.2 并行查询优化 五、Metadata Exchange 六、可行性 6.1 Minimal Repros 6.2 优化器准确性测试 七、实验 八、相关工作 8.1 查询优化基础 8…

基于51单片机NEC协议红外遥控发送接收proteus仿真设计

1.主要功能: 设计一个51单片机红外遥控发射接收proteus仿真设计 功能要求: 1、使用单片机模拟红外遥控器发射红外编码; 2、利用从机接收红外编码,并将编码以16进制显示到数码管上。 需注意仿真中51单片机芯片是兼容的&#x…

最近惊爆谷歌裁员

Python团队还没解散完,谷歌又对Flutter、Dart动手了。 什么原因呢,猜测啊。 谷歌裁员Python的具体原因可能是因为公司在进行技术栈的调整和优化。Python作为一种脚本语言,在某些情况下可能无法提供足够的性能或者扩展性,尤其是在…

X 推出 Stories 功能,由 Grok AI 生成新闻摘要

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Discourse 清理存储空间的方法

Discourse 使用一段时间以后会发现硬盘空间占用非常多。 主要是因为 Docker Image 的问题,如果升级次数越多,空间占用越多。 运行下面的命令: ./launcher cleanup 能够帮助你清理 Discourse 占用的空间。 如下面代码所示: […

【目标检测】Deformable DETR

一、前言 论文: Deformable DETR: Deformable Transformers for End-to-End Object Detection 作者: SenseTime Research 代码: Deformable DETR 特点: 提出多尺度可变形注意力 (Multi-scale Deformable Attention) 解决DETR收敛…

视频剪辑:视频文件元数据修改工具,批量操作提升效率和准确性

在视频剪辑和后期处理的过程中,除了对视频本身的编辑和修改,元数据的管理和修改同样重要。元数据,如标题、艺术家、专辑封面等,不仅提供了视频文件的基本信息,还有助于更好地组织、搜索和共享视频内容。而针对视频文件…

迅雷永久破解

链接:https://pan.baidu.com/s/1ZGb1ljTPPG3NFsI8ghhWbA?pwdok7s 下载后解压 以管理员身份运行绿化.bat,会自动生成快捷方式,如果没有可以在program中运行Thunder.exe

一篇文章,系统性聊聊Java注解

你好! 这类系统性聊聊***知识点的文章,是希望给大家带来对某个技术的全貌认识,如果大家喜欢,后续可以陆续更新此系列 下面,开始今天的分享 在之前,我们已经分享过注解相关的三个面试题, 今天的…

【数据结构】单链表和双链表的基操实现

文章目录 一、链表的概念及结构二、链表的分类三、无头单向非循环链表1.单链表创建2.尾插和头插3.尾删和头删4.打印5.查找6.插入7.删除8.销毁 四、带头双向循环链表1.双链表的创建2.初始化3.判断链表是否为空4.尾插和头插5.尾删和头删6.查找7.插入8.删除9.销毁 五、总结链表和顺…