判断一个单链表中是否存在环--Go

Posted

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的主要内容,如果未能解决你的问题,请参考以下文章

判断链表中是否有环 ----- 有关单链表中环的问题

判断单链表是否存在环及寻找环的入口点

判断一个单链表是否存在环

如果单链表有环,求环的起始位置

单链表交叉问题(单链表存在环的问题)

判断单链表中是否有环(循环链表)