题目描述:
给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。
示例1:
输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。
示例2:
输入:head = [1], pos = -1 输出:false 解释:链表中没有环。
解题分析:
题解一:哈希表判定
思路:通过hash表来检测节点之前是否被访问过,来判断链表是否成环。这是最容易想到的一种题解了
func hasCycle(head *ListNode) bool { m := make(map[*ListNode]int) for head != nil { if _,exist := m[head];exist { return true } m[head]= 1 head = head.Next } return false }
题解三:双指针解法
思路来源:先想象一下,两名运动员以不同速度在跑道上进行跑步会怎么样?相遇!好了,这道题你会了。
解题方法:通过使用具有 不同速度 的快、慢两个指针遍历链表,空间复杂度可以被降低至 O(1)。慢指针每次移动一步,而快指针每次移动两步。
假设链表为
其步骤如下:
func hasCycle(head *ListNode) bool { if head == nil { return false } fast := head.Next // 快指针,每次走两步 for fast != nil && head != nil && fast.Next != nil { if fast == head { // 快慢指针相遇,表示有环 return true } fast = fast.Next.Next head = head.Next // 慢指针,每次走一步 } return false }
地址:https://mp.weixin.qq.com/s/ZlskhjXDi6WzfKLX4d2ufg