1. 题目描述
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/linked-list-cycle 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 示例
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
提示:
- 链表中节点的数目范围是 [0, 10的4次方]
- -10的5次方 <= Node.val <= 10的5次方
- pos 为 -1 或者链表中的一个 有效索引 。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/linked-list-cycle 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
3. 思路
值的大小是有范围的,只要选择一个超过范围的值作为判断依据,每次遍历的时候判断是否为已经修改过的值,则可以确认是否已经重新进入循环。
4. 遇上的问题
暂无
5. 具体实现代码
自己写的代码
type ListNode struct {
Val int
Next *ListNode
}
func hasCycle(head *ListNode) bool {
const changedNum = 100000001
if head == nil{
return false
}
for {
if head.Next == nil {
return false
}
if head.Val == changedNum{
return true
}
head.Val = changedNum
head = head.Next
}
return false
}
6. 官方题解
func hasCycle(head *ListNode) bool {
if head == nil || head.Next == nil {
return false
}
slow, fast := head, head.Next
for fast != slow {
if fast == nil || fast.Next == nil {
return false
}
slow = slow.Next
fast = fast.Next.Next
}
return true
}
作者:LeetCode-Solution 链接:https://leetcode-cn.com/problems/linked-list-cycle/solution/huan-xing-lian-biao-by-leetcode-solution/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这个题解还是有意思的,通过快慢两个指针,慢指针一次前进一步,快指针一次前进两步,分成有环和无环两种情况讨论:
- 无环,遇到指针为nil时返回false。
- 有环,每次快指针都比慢指针多走一步,所以两指针在环内必定会相遇,所以判断为环。
7 题目来源
leetCode
快慢指针复习题,good~ ------swrici
|