怎么检测一个链表是否有环?
1. 初始化两个指针,一个慢指针 slow 指向头节点,一个快指针 fast 也指向头节点;
2. 开始遍历链表,每次让 slow 向后移动一个节点,fast 向后移动两个节点;
3. 如果存在环,那么快指针终将追上慢指针,并在某一时刻与慢指针重合。如果不存在环,那么快指针会先到达链表尾部;
4. 如果存在环,我们可以进一步找到环的起点。当快指针与慢指针相遇时,让其中一个指针重新指向头节点,然后两个指针以相同的速度(每次前进一个节点)遍历链表,直到它们再次相遇,这个点就是环的起点。
时间复杂度为O(n),空间复杂度为O(1)。
-
上一篇
怎么检测一个链表是否有环?
<p>方法一、穷举遍历</p><p><br></p><p>首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID(即重新遍历len-1步)依次作比较。如果发现新节点之前的所有节点当中存在相同节点ID,则说明该节点被遍历过两次,链表有环;如果之前的所有节点当中不存在相同的节点,就继续遍历下一个新节点,继续重复刚才的操作。</p><p>例如这样的链表:A->B->C->D->B->C->D, 当遍历到节点D的时候,我们需要比较的是之前的节点A、B、C,不存在相同节点。这时候要遍历的下一个新节点是B,B之前的节点A、B、C、D中恰好也存在B,因此B出现了两次,判断出链表有环。</p><p><br></p><p><span style="color: rgb(77, 77, 77);">时间复杂度为(n^2),空间复杂度为O(1)。</span></p><p><br></p><p>方法二、哈希表/set 缓存</p><p><br></p><p>哈希表:首先创建一个以节点ID为键的HashSet集合,用来存储曾经遍历过的节点。然后同样是从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就用新节点和HashSet集合当中存储的节点作比较,如果发现HashSet当中存在相同节点ID,则说明链表有环,如果HashSet当中不存在相同的节点ID,就把这个新节点ID存入HashSet,之后进入下一节点,继续重复刚才的操作。</p><p><br></p><p>set集合:还可以用 set 遍历链表,把节点放入set里,每次访问下个节点时,如果set长度不变,则跳出,说明有环。否则set长度+1,继续遍历。</p><p><br></p><p><span style="color: rgb(77, 77, 77);">该方法时间复杂度是O(N),空间复杂度上因为需要额外等数量的存储空间,所以空间复杂度是O(n)。</span></p><p><br></p><p>方法三、快慢指针</p><p><br></p><p>首先创建两个指针1和2(在java里就是两个对象引用),同时指向这个链表的头节点。然后开始一个大循环,在循环体中,让指针1每次向下移动一个节点,让指针2每次向下移动两个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断出链表有环,如果不同,则继续下一次循环。</p><p><br></p><p>例如链表A->B->C->D->B->C->D,两个指针最初都指向节点A,进入第一轮循环,指针1移动到了节点B,指针2移动到了C。第二轮循环,指针1移动到了节点C,指针2移动到了节点B。第三轮循环,指针1移动到了节点D,指针2移动到了节点D,此时两指针指向同一节点,判断出链表有环。</p><p><br></p><p><span style="color: rgb(77, 77, 77);">该方法时间复杂度是O(N),空间复杂度上因为需要额外等数量的存储空间,所以空间复杂度是O(1)。<span class="ql-cursor"></span></span></p><p><br></p>
-
下一篇
怎么检测一个链表是否有环?
怎么检测一个链表是否有环?
相关文章
- 请谈谈您对PHP的垃圾回收机制的了解及实践。
- 聊一下高并发和高性能的区别和联系?
- PHP中如何处理文件上传和下载?
- PHP中如何进行单元测试以及如何在开发过程中保证代码质量?
- 如何通过PHP来保护您的代码免受SQL注入攻击?
- 请问PHP中如何实现多线程?
- 请解释什么是defer语句,以及它有什么作用?
- 请举例说明PHP中如何处理异常?
- 请解释下PHP中会话(session)和Cookie(cookie)的作用。
- 请解释一下PHP中的MVC模式是如何工作的?
- 请给一个例子解释一下PHP中的闭包函数是什么?
- 在PHP中,Magic Method都有哪些,并举例说明它们的作用?
- 请提供至少三个通过PHP实现的网站性能优化技巧。
- 请描述在Golang中使用MongoDB时的最佳实践。
- 请解释HTTP的基本概念,以及在Golang中如何使用HTTP?
- PHP中常用的设计模式有哪些?
- 如何在Golang中实现单例模式?
- PHP7和PHP5的性能上有什么差别?
- 如何在Golang中进行并发编程?
- 请列出与PHP相关的缓存机制及其优缺点。
微信收款码
支付宝收款码