点击个人博客,查看更多文章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