leetcode 探索 鏈表 環形鏈表

題目

給定一個鏈表,判斷鏈表中是否有環。

爲了表示給定鏈表中的環,我們使用整數 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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章