判断一个单链表中是否存在环--Go
链表的一个结点的结构体如下:
type LNode struct {
value int
next *LNode
}
对于一个单链表,如果他要存在环,那么至少存在两个节点,也就是说最后一个结点的next指向了前面的某个结点。
所以在判断链表是否存在环的时候,我们添加快慢两个指针fast和slow,fast指针每次向前走两步,slow指针每次向前走一步,所以相对来说,fast指针相对slow指针每次向前走了一步。
两种情况,一种是不存在环,另一种是存在环:
不存在环:
这是一个单链表,如果不存在环,那么fast指针肯定会先走到链表末尾,此时就说明了链表不存在环
存在环:
fast不会走到链表末尾,因为存在环的链表不存在末尾,此时fast会先走进环中,然后slow会后走进环中,因为fast每次相对slow多走一步,所以当fast和slow都在环中以后,经过某个步数的行走,fast肯定会追上slow,此时就说明了链表存在环
func checkLinkListRing(L *LNode) bool {
fast, slow := L, L
for fast != nil {
if fast.next != nil { //不存在环的奇数个结点的链表,在这里就退出了,如果没有这个判断,此时就说fast.nil.next,就会报空指针的错误
fast = fast.next.next
} else {
return false
}
slow = slow.next
if fast == slow {
return true
}
}
return false
}
func main() {
// fmt.Println("hello world")
L1 := LNode{
value: 1,
next: nil,
}
L2 := LNode{
value: 2,
next: nil,
}
L3 := LNode{
value: 3,
next: nil,
}
L4 := LNode{
value: 4,
next: nil,
}
L5 := LNode{
value: 5,
next: nil,
}
L6 := LNode{
value: 6,
next: nil,
}
L1.next = &L2
L2.next = &L3
L3.next = &L4
L4.next = &L5
L5.next = &L6
L6.next = &L3
fmt.Println(checkLinkListRing(&L1))
}
浙公网安备 33010602011771号