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 }