题目
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-cycle
分析
如果有环,那么用双指针,一个每次走两步,一个每次走一步,那么走的快的,如果遇到环,就会回头,那么就一定会追上慢指针,通过判断快和慢是否相等判定。
配合hashmap,每次走一步判断hashmap里有没有,有就表明回头了,没有就存入hashmap。
解法
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func hasCycle(head *ListNode) bool {
if head == nil || head.Next == nil {
return false
}
// 快慢指针,一个走两步,一个走一步,如果有环,那么快指针一定会赶上慢指针。快和慢是否相等, 注释掉的这部分这种写法也可以,只是啰嗦了点,
// var first, second *ListNode
// first = head
// if head.Next == nil {
// return false
// }
// if head.Next.Next != nil {
// second = head.Next.Next
// } else {
// return false
// }
// for {
// // fmt.Printf("first: %d, second: %d\n", first.Val, second.Val)
// if first == second {
// return true
// }
// //
// first = first.Next
// //
// if second != nil && second.Next != nil && second.Next.Next != nil {
// second = second.Next.Next
// } else {
// return false
// }
// }
slow, fast := head, head.Next
for slow != fast {
// slow == nil 不需要判断slow,因为fast已经探路了。
if fast == nil || fast.Next == nil {
return false
}
slow = slow.Next
fast = fast.Next.Next
}
return true
}