題目
給定一個鏈表,判斷鏈表中是否有環。
爲了表示給定鏈表中的環,我們使用整數 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
}