Leetcode 141. 环形链表
141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com)

思路 1 快慢指针:
1. 设置两个指针,一个一次走一步,一个一次走两步。
2. 如果这个链表有环,那么快指针就一定会在某一个节点从后面追上慢指针。
3. 如果快指针可以指向nil, 那么这个链表就不是一个环形链表。
/**
* 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
}
slow := head
fast := head.Next
for fast != nil && fast.Next != nil {
fast = fast.Next.Next
slow = slow.Next
if fast == slow {
return true
}
}
return false
}
思路 2 哈希表法
1. 对链表进行遍历。
2. 每遍历一个链表节点就将它存到哈希表中。
3.如果在插入哈希表时发现这个节点已经存在,则说明这个链表有环。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func hasCycle(head *ListNode) bool {
hashMap := make(map[*ListNode]int)
for head != nil {
if _, ok := hashMap[head]; ok {
return true
}
hashMap[head]=0
head = head.Next
}
return false
}

浙公网安备 33010602011771号