查看“Cycle detection”的源代码
←
Cycle detection
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看和复制此页面的源代码。
判断环路也可使用一个集合记录所有访问过的节点,当当前节点已在集合中时说明链表有环,但此方法空间复杂度为 O(n)。 == Floyd 判圈法(Floyd's cycle-finding algorithm) == 判断链表环路的 O(1) 空间方法。 给定两个指针,fast 和 slow。第一次遍历时 fast 每次迭代前进两步,slow 前进一步。如果 fast 可以走到尽头,那么说明没有环路;如果 fast 可以无限走下去,那么说明一定有环路且一定存在一个时刻 fast 和 slow 相遇。当 slow 和 fast 第一次相遇时,将 fast 重新移动到链表开头,并让 slow 和 fast 每次都前进一步。当 slow 和 fast 第二次相遇时,相遇的节点即为环路的开始点。 == 相关题目 == === [https://leetcode.com/problems/linked-list-cycle-ii/ LeetCode 142. Linked List Cycle II] === Python 解法: <syntaxhighlight lang=python> def detectCycle(self, head: ListNode) -> ListNode: # Floyd's cycle-finding algorithm, O(1) space fast = slow = head while fast and fast.next: fast = fast.next.next slow = slow.next if fast is slow: break else: return None fast = head while fast is not slow: fast = fast.next slow = slow.next return fast </syntaxhighlight> == 另见 == * [[wikipedia:Cycle detection]] [[Category:刷题]] [[Category:链表]] [[Category:双指针]]
返回至
Cycle detection
。
导航菜单
个人工具
登录
名字空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息