go语言判断单链表中是否存在环

使用快慢指针解决经典链表问题,详细分析如何通过一次遍历判断单链表中是否存在环。实现包括创建链表、设置环以及不同情况下的运行结果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击个人博客,查看更多文章https://elonjelinek.github.io

判断单链表是否存在环是一个经典的快慢指针问题,一个每次走一步的指针,和一个每次走两步的指针,如果链表里有环的话,两个指针最终肯定会相遇,具体实现如下:
单链表的结构

type Node struct {
    value    int
    nextNode *Node
}

是否存在环

func hasCycle(head *Node) bool {
    slow := head
    fast := head
    for fast != nil && fast.nextNode != nil {
        slow = slow.nextNode
        fast = fast.nextNode.nextNode
        if fast == slow {
            return true
        }
    }
    return false
}

创建5个节点,并链起来,最后让第四个节点指向第2个节点,

func main() {
    node1 := new(Node)
    node2 := new(Node)
    node3 := new(Node)
    node4 := new(Node)
    node5 := new(Node)
    node1.value = 1
    node2.value = 2
    node3.value = 3
    node4.value = 4
    node5.value = 5
    node1.nextNode = node2
    node2.nextNode = node3
    node3.nextNode = node4
    node4.nextNode = node2
    //node4.nextNode = node5

    fmt.Println(hasCycle(node1))
}

运行结果:

true

说明存在环

再让第四个节点指向第五个几点,就输出了false,说明不存在环

func main() {
    node1 := new(Node)
    node2 := new(Node)
    node3 := new(Node)
    node4 := new(Node)
    node5 := new(Node)
    node1.value = 1
    node2.value = 2
    node3.value = 3
    node4.value = 4
    node5.value = 5
    node1.nextNode = node2
    node2.nextNode = node3
    node3.nextNode = node4
    //node4.nextNode = node2
    node4.nextNode = node5

    fmt.Println(hasCycle(node1))
}

完整代码

package main

import "fmt"

type Node struct {
    value    int
    nextNode *Node
}

func hasCycle(head *Node) bool {
    slow := head
    fast := head
    for fast != nil && fast.nextNode != nil {
        slow = slow.nextNode
        fast = fast.nextNode.nextNode
        if fast == slow {
            return true
        }
    }
    return false
}

func main() {
    node1 := new(Node)
    node2 := new(Node)
    node3 := new(Node)
    node4 := new(Node)
    node5 := new(Node)
    node1.value = 1
    node2.value = 2
    node3.value = 3
    node4.value = 4
    node5.value = 5
    node1.nextNode = node2
    node2.nextNode = node3
    node3.nextNode = node4
    //node4.nextNode = node2
    node4.nextNode = node5

    fmt.Println(hasCycle(node1))
}

点击个人博客,查看更多文章https://elonjelinek.github.io

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值