链表带环问题之判断链表是否带环

2024-05-01 05:04

本文主要是介绍链表带环问题之判断链表是否带环,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

目录

  • 问题展示
  • 一. 前言
  • 二. 判断链表是否带环
  • 三. 代码展示
  • 四. 结语

问题展示

在这里插入图片描述



一. 前言


  在链表的学习中我们知道,常见的链表如下图所示:

图1


  那带环链表又是如何呢?

  带环链表是指链表的最后一个节点的 NEXT 所指向的地址不再是“ 空指针 NULL ”,而是原链表中的一个随机节点,可能为头节点,也可能为中间节点,视情况而定。

  具体如下:
在这里插入图片描述




二. 判断链表是否带环


  在有了上面的了解后,我们将对如何判断链表是否带环进行讨论。
  很多同学可能会想到说,我们可以直接找到链表的最后一个节点,判断它的 NEXT 指向是否为 NULL 不就可以很直白的得到是否带环了吗。可话是这么说,在上图中我们可以很轻松的看出链表的尾节点是哪一个,但这只是为了方便理解而画出的图,如果换成下面这样呢?

在这里插入图片描述
  如果题目中没有明确的告知哪一个是头节点,又如何判断尾节点呢?

  显然这种方法是不可行的。

  但应对这种问题我们也不是毫无头绪,可以利用我们的“ 老朋友 ”:快慢指针 来解决问题。在这里插入图片描述
  我们让快慢指针同时指向链表的头部,之后让快指针每次在链表中走两个节点的位置,而慢指针每次走一个节点的位置,同时进行。
在这里插入图片描述
  在经历一段时间后,快指针已经在环中走了很久,而慢指针刚刚进入环,如下图所示:
在这里插入图片描述
  这时就不再是慢指针在后,快指针在前了,我们可以将其看作是快指针在慢指针的后面追赶,而我们再让它们前进一段时间后,快指针会和慢指针走到同样的位置,因为这时候他们的速度差为 1个节点(前面讲到过慢指针走一个节点,而快指针走两个节点),故不论慢指针进入环时他们相距多少距离,都一定会相遇,而当 fast == slow 时,我们就可以判断这个链表时带环得了。
在这里插入图片描述
  再说链表不带环的情况:那就是快指针走到了链表的末尾,即快指针指向了 NULL 或 快指针的NEXT指向了 NULL。




三. 代码展示


  下面是代码展示:
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode, * pListNode;
bool hasCycle(struct ListNode* head)
{pListNode slow = head;pListNode fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;if (fast == slow)return true;}return false;
}



四. 结语


  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

这篇关于链表带环问题之判断链表是否带环的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950778

相关文章

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地