链表OJ题【环形链表】(3)

news2024/11/17 21:18:30

目录

环形问题的思考

❓Q1

❓Q2

🙂Q2 

❓Q3

❓Q4

8.环形链表

9.环形链表Ⅱ


今天接着链表的经典问题环形问题。大家一定要自己动手多写写。🙂

  • 快慢指针(保持相对距离/保持相对速度)
  • 野指针
  • 考虑为NULL的情况
  • 带环链表:尾节点的next指向链表中的任意点(甚至可能指向它自己)
  • 循环条件
  • 结论

环形问题的思考

假设现有一个链表是带环的,请你做出如下思考和证明! (环形链表如下)

❓Q1

slow一次走1步,fast一次走2步,他们一定会相遇吗?(slow在走满一圈之前)

假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。当慢指针刚进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。此时,两个指针每移动一次,之间距离缩小一步,不会出现每次刚好是套圈的情况。

  • 因此:在满指针走到一圈之前,快指针肯定是可以追上慢指针的,即相遇  

❓Q2

slow一次走1步,fast一次走3步,他们一定会相遇吗?

  • 如果N是偶数第一圈就直接追上了。
  • 如果N是奇数,C是奇数,C-1是偶数,第二圈也追上了。
  • 如果N是奇数,C是偶数,C-1是奇数,永远追不上。
  • N是slow开始入环,fast的最初开始追击的距离。
  • C是环的长度。 

🙂Q2 

在上面的基础上,请问N是奇数,C是偶数,C-1是奇数这个条件是否成立。请证明! 

  • 起点到入环的距离:L
  • N是slow开始入环,fast的最初开始追击的距离。
  • 环的长度:C
  • slow每次走1步
  • fast每次走3步
  • 关键点:从开始位置到slow入环的路程,速度是3倍关系,同一时间段,路程是3倍的关系。
  • 结论:N是奇数,C是偶数,C-1是奇数这个条件不成立。 

❓Q3

slow一次走n步,fast一次走m步,他们一定会相遇吗?(m>n>1)

  • 如果  N%(m-n) == 0 第一圈就直接追上了。
  • 如果  N%(m-n) == x 第一圈也追不上了。
  • 如果  (C-x)%(m-n) == 0 第二圈就追上了。
  • 如果  (C-x)%(m-n)  != 0   永远追不上了。
  • N是slow开始入环,fast的最初开始追击的距离。
  • C是环的长度。 

❓Q4

请证明:

让一个指针slow链表起始位置开始遍历链表,同时让一个指针fast判环时相遇点的位置开始绕环运行,注意slow每次走1步,fast每次走1步,最终肯定会在入口点的位置相遇。

  •  起点到入环的距离:L
  • 入口点到相遇点:X
  • 环的长度:C
  • slow每次走1步
  • fast每次走2步
  • 关键点:从起始点到相遇点路程。速度是二倍关系。同一时间段,路程也是2倍的关系。
  • 结论:一个指针从相遇点开始走,一个指正从头开始走,他们会在入口点相遇

8.环形链表

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

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

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

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

【快慢双指针】

思路:快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表其实位置开始运行,
如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) 
{
    struct ListNode *faster=head;
    struct ListNode *slow=head;
    //一起走faster走2步 slow走1步--保持相对速度
    while(faster && slow && faster->next)
    {
        faster=faster->next->next;
        slow=slow->next;
        if(slow == faster)
        {
            return true;
        }
    }
    return false;
}

//另外写法

bool hasCycle(struct ListNode *head) 
{
    struct ListNode *faster=head;
    struct ListNode *slow=NULL;
    if(head == NULL)
    {
        return false;
    }
    while(faster != slow)
    {
        if(slow == NULL)
        {
            slow=head;
        }
        if(faster == NULL || faster->next == NULL)
        {
            return false;
        }
        faster=faster->next->next;
        slow=slow->next;
    }
    return true; 
}

 

9.环形链表Ⅱ

 给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

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

不允许修改 链表。

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

【快慢指针】

  • 找到相遇的地方
  • 让一个指针slow链表起始位置开始遍历链表,同时让一个指针fast判环时相遇点的位置开始绕环运行,注意slow每次走1步,fast每次也走1步,最终会在入口点的位置相遇。(结论)
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) 
{
    struct ListNode *slow=head;
    struct ListNode *fast=head;
    struct ListNode *meet=NULL;
    while(fast && fast->next)
    {
        fast=fast->next->next;
        slow=slow->next;
        if(fast == slow)
        {
            slow=head;
            while(fast != slow)
            {
                slow=slow->next;
                fast=fast->next;
            }
            return fast;
        }
    }
    return NULL;
}


 【链表的相交】

感谢各位!下篇我们开始双向链表的学习。一起加油💪小伙伴们! 

【链表练习题】链表知识点题库 - 力扣(LeetCode)

 牛客网在线编程_算法篇_面试必刷TOP101 (nowcoder.com)

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

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

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

相关文章

推荐系统笔记--Swing模型的原理

1--Swing模型的引入 在 Item CF 召回中,物品的相似度是基于其受众的交集来衡量的,但当受众的交集局限在一个小圈子时,就会误将两个不相似的物品定义为相似; Swing 模型引入用户的重合度来判断两个用户是否属于一个小圈子&#xff…

基于鲸鱼算法优化概率神经网络PNN的分类预测 - 附代码

基于鲸鱼算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于鲸鱼算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于鲸鱼优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

Java终端模式小尝试

Java终端模式小尝试 1、IDE中终端1.1 拉去代码 jediterm1.2 IDE调用系统终端 2、待续~~ 1、IDE中终端 终端_Intellij IDEA、Terminal emulator | pycharm Documentation JetBrains jediterm WindTerm:新一代开源免费的终端工具,GitHub星标6.6k&#xff…

基于蜉蝣算法优化概率神经网络PNN的分类预测 - 附代码

基于蜉蝣算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蜉蝣算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蜉蝣优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

智能一体化管网水位监测仪怎么样?

城市排水管网是城市正常运行的关键环节,这是地上和地下通道的连接点,一旦出现问题便会影响城市生命线建设的工程进展。在复杂的地下管道内想要了解水位数据,对于政府部门来讲是一个管理难题。如果可以采取智能产品在其中发挥作用,…

如何使用PHPStudy本地快速搭建网站并实现远程访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点,测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中,查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

【Devchat 插件】创建一个GUI应用程序,使用Python进行加密和解密

VSCode 插件 DevChat——国内开源的 AI 编程! 写在最前面DevChat是什么?什么是以提示为中心的软件开发 (PCSD)?为什么选择DevChat?功能概述情境构建添加到上下文生成提交消息提示扩展 KOL粉丝专属福利介绍D…

【 第十二章】软件设计师 之 面向对象设计与结构化分析设计

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 备考资料导航 软考好处:软考的…

servlet 的XML Schema从哪边获取

servlet 6.0的规范定义: https://jakarta.ee/specifications/servlet/6.0/ 其中包含的三个XML Schema:web-app_6_0.xsd、web-common_6_0.xsd、web-fragment_6_0.xsd。但这个页面没有给出下载的链接地址。 正好我本机有Tomcat 10.1.15版本的源码&#…

改进YOLO系列 | YOLOv5/v7 引入反向残差注意力模块 iRMB | 《ICCV 2023 最新论文》

论文地址:https://arxiv.org/abs/2301.01146 代码地址:https://github.com/zhangzjn/EMO 本论文着重于开发现代、高效、轻量级的模型,用于进行密集预测,同时在参数、FLOPs和性能之间进行权衡。倒置残差块(IRB)作为轻量级CNN的基础设施,但在基于注意力的研究中尚未找到对…

Linux系统编程——实现cp指令(应用)

cp指令格式 cp [原文件] [目标文件] cp 1.c 2.c 功能是将原文件1.c复制后并改名成2.c(内容相同,实现拷贝) 这里需要引入main函数的参数解读: 我们在定义函数时许多都带有参数,输入参数后便可进行定义函数内的功能执行,而main…

图像相似度对比方法

1.哈希方法,其中包括均值哈希、插值哈希、感知哈希方法。计算出图片的哈希值,一般使用汉明 距离计算两个图片间的差距。 2.直方图算法,其中包括灰度直方图算法,RGB直方图算法, 3.灰度图算法:MSE、SSIM、…

改进YOLO系列 | YOLOv5/v7 引入Super Token Sampling ViT | 《CVPR 2023 最新论文》

论文地址:https://arxiv.org/abs/2211.11167 代码地址:https://github.com/hhb072/STViT 视觉变换器已经在许多视觉任务中取得了令人印象深刻的性能。然而,它在捕捉浅层的局部特征时可能会受到高度冗余的影响。因此,引入了局部自注意力或早期卷积,这些方法牺牲了捕捉长距…

Vue3 setup函数

一、setup函数介绍 setup函数是Vue3中全新的一个配置项,值为一个函数,是所有 Composition API 中“表演的舞台”。 我们在Vue2中用到的所有数据、方法,都需要配置在setup中。 这是我们在Vue2中的写法: 这是我们在Vue3 setup中的…

JS移动端触屏事件

在我们PC端中有许多的事件,那我们在移动端有没有事件呢?让我为大家介绍一下移动端常用的事件,触屏事件 触屏事件 touch (也称触摸事件),Android 和IOS 都有 touch 对象代表一个触摸点。触摸点可能是一根手指,也可能是一…

【设计原则篇】聊聊单一职责原则

因为是刚开始写软件设计相关的文章,这里先大概介绍下,软件设计相关的知识图谱。大概分类的话, 编程范式 软件设计相关原则 Don’t Repeat Yourself (DRY)Keep It Simple, Stupid(KISS)Program to an interface, not an implementationYou Ai…

电脑版微信收到的图片怎么样自动保存到指定文件夹中?

8-5 在平时的工作中,如果你每天都需要接收并保存很多同事发来的图片,如何实现自动保存在微信上接收到的图片呢?本文的方法也许适合你,它可以自动把微信上收到的图片、视频、文件帮你保存到指定地方,可以大大地提高工作…

2023年【起重机械指挥】考试试卷及起重机械指挥操作证考试

题库来源:安全生产模拟考试一点通公众号小程序 2023年起重机械指挥考试试卷为正在备考起重机械指挥操作证的学员准备的理论考试专题,每个月更新的起重机械指挥操作证考试祝您顺利通过起重机械指挥考试。 1、【多选题】《中华人民共和国特种设备安全法》…

【狂神说Java】Nginx详解

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :狂神说Java 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远…

postman上传照片,视频,音频等上传文件操作测试方法

Postman上传照片,视频,音频等上传文件操作测试方法 新建一个request,更改请求方式,点击Body 勾选form-data ,key后面下拉框选择File 上一步勾选后Value即出现选择本地文件按钮,填写Key,选择文件即可 此时…