package main
import "fmt"
/*
题目: 判断一个单向链表中是否存在环
最优解思路:1. 使用两个指针,起点都从链表的头结点开始,第一个指针每一步走一个节点,第二个指针每一步走两个节点,
如果存在环两个指针一定会相遇的。这类似于小学中学的追击问题:在一个环形跑道上两个运动员同一地点出发一个运动员速度快另一个速度慢,两个运动员一定会相遇。
*/
// 假设链表节点如下
type Node struct {
num int
next *Node
}
// 查看给定的链表是否有环
func findRing(head *Node) bool {
// p1 p2 指针
p1 := head
p2 := head
for {
// p1 每循环一次移动一个节点
if p1 != nil {
p1 = p1.next
} else {
return false
}
// p2 每循环一次移动两个节点
if p2 != nil && p2.next != nil {
p2 = p2.next.next
} else {
return false
}
// 判断p1 p2是否相等,如果相等则说明存在环
if p1 == p2 {
return true
}
}
}
/*
问题扩展: 1. 求出环的长度。 2. 求出入环点
思路:1. 环长 = p2前进的距离 - p1 前进的距离 (首次相遇)
2. 根据相遇问题解析的到,首次相遇点到入环点的距离(运动方向距离)与起点到入环点的距离相等,由此我们需要求得相遇点,
然后两个指针相同速度一个从head出发,一个从入环点出发,两个指针会在入环点相遇
*/
// 1. 求出环长度
func ge
判断一个单向链表中是否存在环
最新推荐文章于 2020-12-28 20:21:18 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)