【面试常见】链表带环

news2025/1/6 18:17:34

前言

一、什么是环形链表

二、判断链表是否带环

三、(问题1)slow和fast一定会相遇吗?

四、(问题2)fast一次走3/4/n步,还会相遇吗?

五、总结


前言

链表是面试中常见的一类题。分为单链表,双向链表,循环链表等八类。

在基础部分考察单链表较多,涉及:有序链表的合并、链表的逆置、链表的分割、找链表的中间结点。

在进阶方面一种不可少的类型:链表带环问题

本文就深入探讨如何判断链表是否带环,如何找到环的入口点及其证明

一、什么是环形链表

定义:链表的tail结点的next不为空,指向该链表的某个结点。则改链表带环。

另一个定义:如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。

如下图所示:第3个结点的next指向第1个结点。这称该链表带环。

通过链表带环的性质,可以得到:

带环链表不能连续遍历。

如果tail结点的next指向head结点,这时链表为循环链表。

二、判断链表是否带环

方法:快慢指针

思路:fast(快指针)和slow(慢指针)同时从head起点开始走,fast一次走俩步,slow一次走一步。

如果没有环,fast会走到NULL。如果存在环,fast会先进入环,然后在环里一直走(甚至可能多绕几次圈),直到slow进环。此时fast和slow同时在环中,fast开始追slow。

下面来看一下代码

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

相信写出这样的代码对于大多数人来说并不是问题

但是通常面试官会接着往下问这俩个问题。

三、(问题1)slow和fast一定会相遇吗?

答案:slow走一步fast走俩步,一定会相遇。

证明:

fast走的路程是slow的俩倍,所以fast会先进环,slow一步一步往前走,fast在环里走。

假设slow进环时与fast的距离是N

 fast开始追slow,fast一次走俩步,slow一次走一步,它们的路程差为1步,每次减小1。

它们之间的距离就会从N、N-1、N-2.......4、2直到0,为0时,就是相遇。

所以fast一次走两步,slow一次走一步,一定会相遇。

四、(问题2)fast一次走3/4/n步,还会相遇吗?

答案:不一定

1.fast一次走3步

假设slow进环时与fast的距离是N,路程差为2,每次减少2

N为偶数时              N为奇数时 

   N-2                            N-2

   N-4                            N-4

   N-6                            N-6

   .....                             ......

   4                                  3

   2                                  1

   0                                 -1

  当N为偶数时,fast一定能追上slow

  当N为奇数时,fast会错过slow,再次追击

  假设链表环的长度是C

  fast与slow的距离为-1,就是fast在slow前一步。

可以理解为初始时刻,fast与slow的距离为C-1。将slow看为参照物,fast就是每次走俩步,追击slow。能否遇到,还是要分C-1为奇数还是偶数。

C-1是偶数                C-1是奇数

C-1-(2)                     C-1-(2)

C-1-(4)                     C-1-(4)

C-1-(6)                     C-1-(6)

.......                          ........

2                                 1

0                                -1

C-1是奇数时,最后余下-1,意味着fast第二次经过slow,之后它们永远不会相遇。

错过永远不会再遇到。

2.fast一次走4步

假设slow进环时与fast相差N的距离,每次距离减少3步

N为三的倍数   N不是三的倍数

    N-3                N-3       N-3

    N-6                N-6       N-6

    ......                .....       ......

    3                      2           1

    0                     -1          -2    

  N为3的倍数时,会相遇。

如果N不为3的倍数,会出现fast提前slow 2步,fast提前slow1步的情况。

下面讨论fast距离C-1开始追slow和fast距离C-2开始追slow

C-2 或者C-1为3的倍数          非3的倍数

C-2          C-1                          

C-5          C-4

....            ......

3                3                        .....      ......

0                0                         -1         -2       

当C-1/C-2为3的倍数时,fast会第二次追上slow

五、总结

本文先阐述了环形链表的概念,并学习如何判断链表带环。

思路就是快慢指针,fast,slow指针。

在fast走2步,slow走1步,一定可以追上。推广:只要fast与slow之间的距离差为1步,那么一定能够相遇。

在fast与slow的距离差>2时,可能追上也追不上,需要具体分析。

下文将对如何返回环形链表的入口进行深入分析。

感谢阅读。

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

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

相关文章

Maven详细教程(图文并茂)

一、maven概述 1.1、项目开发中的问题 1、我的项目依赖一些jar包,我把他们放在哪里?直接拷贝到项目的lib文件夹中?如果我开发的第二个项目还是需要上面的那些jar包,再把它们复制到我当前项目lib中?那如果现在是第三次了&#xf…

ALSA子系统(十八)------指纹解锁动画提示声卡顿问题解析

你好!这里是风筝的博客, 欢迎和我一起交流。 很久没写kernel相关的东西了,主要是来到手机厂之后,大部分还是在Android上,Kernel虽然也有涉及,但毕竟只是有所涉及,主要业务逻辑还是在HAL之上&am…

【c语言】详解 结构体的内存对齐补齐

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

计算机网络的性能指标

1.计算机网络的性能指标 笔记来源&#xff1a;湖科大教书匠&#xff1a;计算机网络的性能指标 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 速率 注意&#xff1a;数据量中1KB 2 10 B 2^{10}B 210B、数据率中1kb/s 1 0 3 10^{3} 103b/s 1.2…

Chatgpt如何引入新的知识?我们来看下ACL2023 预训练模型能否对新注入的知识进行推理这篇文章

一、概述 title&#xff1a;Can LMs Learn New Entities from Descriptions? Challenges in Propagating Injected Knowledge 论文地址&#xff1a;https://arxiv.org/abs/2305.01651 相关代码&#xff1a; EKP数据和代码&#xff1a;GitHub - yasumasaonoe/entity_knowle…

香橙派4和树莓派4B构建K8S集群实践之四:BuildKit与LNMP

目录 1. 说明 2. 开始前的准备工作 2.1 docker 验证用户信息设置 2.2 安装BuildKit 3. 安装步骤 3.1 申请一个pvc存储区 (wwwroot-pvc.yaml) 3.2 Nginx 3.3 php-fpm 3.3.1 构建并推送镜像 4. 遇到的问题 5. 相关命令 6. 参考 1. 说明 k8s带来的灵活性&#xff0c;使…

Linux系统之安装PDF阅读器

Linux系统之安装PDF阅读器 一、PDF介绍1. PDF简介2. PDF特点3. evince介绍 二、本次实践环境介绍1. 本地环境规划2. 本次实践介绍 三、本地环境检查1. 检查操作系统版本2. 查看系统内核版本 四、安装前准备工作1. 配置yum仓库2. 检查本地yum仓库状态3. 查看evince安装包 五、安…

怎样做好一场线上研讨会?

怎样做好一场线上研讨会&#xff1f; 1-策划和准备。在开始前&#xff0c;需要仔细策划和准备。确定研讨会的主题、目标、议程和参与者&#xff0c;并为参与者提供足够的信息和资源&#xff0c;以确保他们能够充分准备并参与讨论。 2-选择合适的在线平台。选择一个适合您需求…

Ubuntu搭建VPN服务,PPTD和OpenVPN

本文提供了两种vpn方式&#xff0c;pptd移动端支持不够&#xff0c;OpenVPN跨平台能力更前&#xff0c;且安全性更好。 但pptd也不是一无是处&#xff0c;在使用midjuriney网站时&#xff0c;openvpn搭建的网络出现了无法将机器人加入服务器的情况&#xff0c;更换pptd后操作无…

基于Maven创建多模块的Spring Boot项目

使用 Spring Boot的初始化器等创建Spring Boot项目时,需要在pom.xml指定该项目的父项目是 spring-boot-starter-parent。 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><versio…

OSPF综合实验(第二部分)

目录 配置OSPF动态路由协议 重发布 减少路由条目&#xff1a;​ 特殊区域&#xff1a; 收敛配置 认证 NAT地址转换 空接口 配置OSPF动态路由协议 AR1&#xff1a; [r1]ospf 1 router-id 1.1.1.1 [r1-ospf-1]area 1 [r1-ospf-1-area-0.0.0.1]network 172.16.32.0 0.0.0.…

DeepLab V3+

Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation 分割图像的语义编码器-解码器和带孔可分离卷积的技术 摘要 对于语义分割任务&#xff0c;深度神经网络通常使用空间金字塔池化模块或编码器-解码器结构。前者通过以多种速率和多种有效视…

手把手教你安装Redis

在上一篇《Redis简介》中介绍了Redis的一特性和使用场景&#xff0c;下面我们就来动手安装一下Redis 主要分为Windows安装、Linux下安装和Docker下安装 Windows下安装Redis 很不幸&#xff0c;Redis官方不支持windows版本&#xff0c;以下是官方原话 Redis is not officiall…

【P19】JMeter CSS/JQuery提取器(CSS Selector Extractor)

文章目录 一、准备工作二、测试计划设计 一、准备工作 百度&#xff1a; https://www.baidu.com/ 进入网页后&#xff0c;右键检查或按F12&#xff0c;打开调试工具 使用CSS/JQuery提取器&#xff0c;获取六个百度热搜文本 二、测试计划设计 &#xff08;1&#xff09;、测…

供水管线 码蹄集

题目来源&#xff1a;码蹄集 题目描述&#xff1a; 解决思路&#xff1a; 首先&#xff0c;题目要求我们去掉一些管道&#xff0c;使得总的管道管理费用最小。在去掉部分管道的情况下&#xff0c;城市之间不再形成一个回路&#xff0c;即城市之间构成了一棵树。因此&#xff…

元宇宙医疗虚拟人的功能,创造哪些新体验

虚拟数字人的出现对于精准医疗及人类健康的发展将带来不可估量的作用。通过三维可视化、3D打印、大数据及人工智能等多种数字化手段&#xff0c;在医学研究方面取得新的进展。 居家/健康&#xff1a;智能虚拟管家、家庭虚拟医生、家庭虚拟陪护员 一、虚拟数字人的医学知识普及优…

ChatGPT中文指令(Prompt)角色预设大全!让你的AI更懂你!

ChatGPT的回答总是不令人满意&#xff0c;那可能是你对AI下错了指令/提示词&#xff08;Prompt&#xff09;&#xff0c;想要ChatGPT更懂你&#xff0c;回答更精准&#xff0c;就要给它下对指令。 在国外有大佬们已经整理出一些标准的问话模板&#xff0c;直接拿来使用后&#…

在Python环境中安装配置GDAL,并演示使用GDAL读取shapefile文件

GDAL是应用广泛的空间数据处理库&#xff0c;可以处理几何、栅格数据&#xff0c;Python是一门简单易学的编程语言&#xff0c;常用来编写数据处理工具、脚本。本文讲解如何在Python环境中安装、配置、使用GDAL。本文示例中使用的GDAL版本为3.4.3 一、下载GDAL的whl包 可以通过…

ComPDFKit PDF SDK for Windows crack

ComPDFKit PDF SDK for Windows crack 增加了对新文本编辑功能的支持&#xff0c;如添加其他字体、设置粗体/斜体、复制文本样式和修改文本透明度。 增加了对新级别文档加密的支持&#xff0c;包括AES-128和AES-256。 ComPDFKit PDF SDK允许开发人员在Windows(iOS和Android平台…

C高级-day(4)-(shell数组、shell中的算数、shell中的分支语句.)

一、编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和H…