关于leetcode:Golang力扣LeetBook初级算法链表环形链表快慢指针

4次阅读

共计 770 个字符,预计需要花费 2 分钟才能阅读完成。

题目:给你一个链表的头节点 head,判断链表中是否有环。如果链表中有某个节点,能够通过间断跟踪 next 指针再次达到,则链表中存在环。为了示意给定链表中的环,评测零碎外部应用整数 pos 来示意链表尾连贯到链表中的地位(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。留神:pos 不作为参数进行传递,仅仅是为了标识链表的理论状况。如果链表中存在环,则返回 true。否则,返回 false。

链接:力扣 LeetBook—高级算法—链表—环形链表.

示例 1:


输出:head = [3,2,0,-4], pos = 1
输入:true
解释:链表中有一个环,其尾部连贯到第二个节点。

示例 2:


输出:head = [1,2], pos = 0
输入:true
解释:链表中有一个环,其尾部连贯到第一个节点。

示例 3:


输出:head = [1], pos = -1
输入:false
解释:链表中没有环。

标签:哈希表、链表、双指针

思路
定义两个指针,一个快指针,一个慢指针,快指针每次走两步,慢指针每次走一步,如果链表中有环得话,那么快慢指针肯定会相遇。

次要 Go 代码如下:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func hasCycle(head *ListNode) bool {
    // 先定义两个指针,一个快指针,一个慢指针,都指向头
    fast, slow := head, head
    for fast != nil && slow != nil && fast.Next != nil {
        slow = slow.Next      // 慢指针每次走一步
        fast = fast.Next.Next // 快指针每次走两步
        if slow == fast {     // 当链表是有环得话,那么快慢指针肯定会相遇
            return true
        }
    }
    return false
}

提交截图

正文完
 0