判断一个单链表中是否存在环--Go
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断一个单链表中是否存在环--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)) }
以上是关于判断一个单链表中是否存在环--Go的主要内容,如果未能解决你的问题,请参考以下文章