码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-06-04 13:36:46      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:nbsp   node   说明   链表   相对   world   nil   nod   添加   

链表的一个结点的结构体如下:

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

标签:nbsp   node   说明   链表   相对   world   nil   nod   添加   

原文地址:https://www.cnblogs.com/gyyyl/p/13042662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!