首页 > 其他分享 >如何判断链表是否存在环?

如何判断链表是否存在环?

时间:2023-12-12 22:32:56浏览次数:22  
标签:current head 判断 是否 next 链表 节点 指针

大家好,今天我们来聊一聊如何判断链表是否存在环。如果你是一个链表的小白,听到“环”这个词可能会感到一头雾水。别担心,我会用通俗易懂的语言来解释这个问题,并带大家看一段代码演示。

首先,我们要了解什么是链表。链表是一种数据结构,由一系列节点组成,每个节点都有一个值和一个指向下一个节点的指针。如果链表中存在一个或多个节点,它们指向同一个节点或形成一个循环,那么我们就说这个链表存在环。

那么,如何判断链表是否存在环呢?有几种常见的方法可以解决这个问题。

方法一:快慢指针法

我们可以使用两个指针,一个快指针(每次移动两个节点)和一个慢指针(每次移动一个节点)。如果链表中存在环,那么快指针最终会追上慢指针。如果链表中不存在环,快指针会先到达链表的末尾。这种方法的核心思想是利用快慢指针的速度差来检测环的存在。

下面是一段使用快慢指针法判断链表是否存在环的代码示例:

python复制代码
 class ListNode:  
 
     def __init__(self, val=0, next=None):  
 
         self.val = val  
 
         self.next = next  
 
   
 
 def hasCycle(head: ListNode) -> bool:  
 
     if not head or not head.next:  
 
         return False  
 
   
 
     slow = head  
 
     fast = head.next  
 
   
 
     while slow != fast:  
 
         if not fast or not fast.next:  
 
             return False  
 
         slow = slow.next  
 
         fast = fast.next.next  
 
   
 
     return True

方法二:哈希表法

另一种方法是使用哈希表来记录每个节点是否已经访问过。如果链表中存在环,那么至少有一个节点会被重复访问。这种方法的时间复杂度是O(n),其中n是链表的长度。但是需要注意的是,这种方法需要额外的空间来存储哈希表。

下面是一段使用哈希表法判断链表是否存在环的代码示例:

python复制代码
 def hasCycle(head: ListNode) -> bool:  
 
     if not head or not head.next:  
 
         return False  
 
   
 
     visited = set()  
 
     current = head  
 
   
 
     while current:  
 
         if current in visited:  
 
             return True  
 
         visited.add(current)  
 
         current = current.next  
 
   
 
     return False

以上两种方法都可以有效地判断链表是否存在环。选择哪种方法取决于你的具体需求和环境限制。如果你对空间复杂度要求较高,可以选择快慢指针法;如果你对时间复杂度要求较高,可以选择哈希表法。

标签:current,head,判断,是否,next,链表,节点,指针
From: https://blog.51cto.com/u_16193759/8791504

相关文章

  • STP判断接口工作模式
    目录拓扑配置LSW1LSW2LSW3LSW4工作原理拓扑配置LSW1[Huawei]stpmodestp[Huawei]stppriority0\\将Lsw1的优先级调为0为根桥LSW2[Huawei]stpmodestp[Huawei]stppriority4096\\将Lsw1的优先级调为4096LSW3[Huawei]stpmodestpLSW4[Huawei]stpmodestp工......
  • 一分钟解决:find invalid user term是否调试?
    今有多年未见的朋友来求助,电脑没办法打字了,向日葵远程一看,只看见一大堆“findinvaliduserterm是否调试”的窗口显示在桌面上,关了半天,鼠标都快点坏了,根本关不完。好吧,先不管这些窗口了,卸载了两个“管家”,先重启了再说。事实证明,我错怪了“两位管家”——系统刚启动,就又弹出一堆“......
  • blob 下载文件type是否必须设置
    又遇到了一件鬼打墙的事,欲哭无泪。1几天前,有个bug:blob文件下载,如果下载非txt文件,比如图片、xlsx,下载后的文件无法正确显示。//下载文件asyncdownload(row,prop){constres=awaitresourceDownload(row[prop.field+"fileId"]);//res为blob......
  • 判断推理-逻辑判断(论证类-一般质疑)
    一般质疑题型介绍归因类之外的质疑题目,均称为一般质疑,即非谈论因果关系。题目形式一般由论据、结论两部分组成,隐含有论证过程,其中论据应正确、充分,论证过程应有效、严谨,结论应合理。题型分类一般质疑可分为无论据有结论、有论据有结论、严谨逻辑关系三类。提问方......
  • [LeetCode Hot 100] LeetCode24. 两两交换链表中的节点
    题目描述思路:创建dummy节点,令dummy.next=head。令cur表示当前到达的节点,初始时cur=dummy。每次需要交换cur后面的两个节点。如果cur的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得cur后面的两个节点node1和node2,通过更新节点的指针关系......
  • [LeetCode Hot 100] LeetCode148. 排序链表
    题目描述思路一:堆排序、小顶堆定义一个最小堆将链表的所有节点放入一个最小堆中直接用队列弹出的最小值依次覆盖掉原链表的值方法一:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}......
  • [LeetCode Hot 100] LeetCode138. 随机链表的复制
    题目描述思路一:添加"小弟"根据遍历到的原节点创建对应的新节点,每个新创建的节点是在原节点后面。原节点i的随机指针(如果有的话),指向的是原节点j,那么新节点i的随机指针,指向的是原节点j的next最后将两个链表分开,再返回新链表就可以思路二:使用哈希表首先创建一个哈希表......
  • [LeetCode Hot 100] LeetCode25. K个一组翻转链表
    题目描述思路:判断链表中是否足够k个元素再将这k个元素内部翻转一下将前后端点连接的指针变化一下方法一:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval)......
  • unity判断点是否在长方体内部
    usingUnityEngine;publicclassCubeCheck:MonoBehaviour{//长方体的位置、旋转和尺寸publicVector3position=newVector3(0,0,0);publicQuaternionrotation=Quaternion.identity;publicVector3size=newVector3(1,1,1);public......
  • [持续更新][数据结构][算法]涵盖线性表、栈、链表、队列、图、动态规划、分治递归、回
    备考考点整理内部排序表格树的主要考点二叉树的常考紧紧抓住\(n_0=n_2+1\)\(n=n_0+n_1+n_2...n_m\)\(n=n_1+2*n_2+3*n_3...m*n_m\)+1哈夫曼树没有度为1的结点,也就是\(n_1=0\)完全二叉树常考总结最大岛屿问题(dfs模板)#include<iostream>#include<algorith......