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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章