分享
Golang 数据结构练习——单链表找环
redexpress · · 1035 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
问题:一个单向链表,怎样怎么检测是否有环,环的初始节点是什么?
package main
import (
"fmt"
)
type ListNode struct {
value int
next *ListNode
}
func NewListNode(i int) *ListNode {
val := new(ListNode)
val.value = i
return val
}
func main() {
a1 := NewListNode(1)
a2 := NewListNode(2)
a3 := NewListNode(3)
a4 := NewListNode(4)
a5 := NewListNode(5)
// 1→2→3→4→5
// ↑⎽⎽⎽⌟
a1.next = a2
a2.next = a3
a3.next = a4
a4.next = a5
a5.next = a3
head := DetectCycle(a1)
fmt.Println(head.value)
}
func DetectCycle(head *ListNode) *ListNode {
fast := head
slow := head
for {
if fast.next == nil || slow.next == nil {
break
}
fast = fast.next.next
slow = slow.next
if fast == slow {
// 找到快慢指针相遇点
break
}
}
if fast == nil || slow == nil {
return nil
}
// 找到快慢指针相遇点后,快慢指针一样的速度移动,找到环的起点
slow = head
for {
if fast == slow {
break
}
fast = fast.next
slow = slow.next
}
return slow
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信1035 次点击
上一篇:Golang标准库——text
下一篇:天道酬勤,T9晋级答辩通过
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
问题:一个单向链表,怎样怎么检测是否有环,环的初始节点是什么?
package main
import (
"fmt"
)
type ListNode struct {
value int
next *ListNode
}
func NewListNode(i int) *ListNode {
val := new(ListNode)
val.value = i
return val
}
func main() {
a1 := NewListNode(1)
a2 := NewListNode(2)
a3 := NewListNode(3)
a4 := NewListNode(4)
a5 := NewListNode(5)
// 1→2→3→4→5
// ↑⎽⎽⎽⌟
a1.next = a2
a2.next = a3
a3.next = a4
a4.next = a5
a5.next = a3
head := DetectCycle(a1)
fmt.Println(head.value)
}
func DetectCycle(head *ListNode) *ListNode {
fast := head
slow := head
for {
if fast.next == nil || slow.next == nil {
break
}
fast = fast.next.next
slow = slow.next
if fast == slow {
// 找到快慢指针相遇点
break
}
}
if fast == nil || slow == nil {
return nil
}
// 找到快慢指针相遇点后,快慢指针一样的速度移动,找到环的起点
slow = head
for {
if fast == slow {
break
}
fast = fast.next
slow = slow.next
}
return slow
}