本题以环形链表II为例:
package main
// 定义链表节点结构
type ListNode struct {
Val int
Next *ListNode
}
func detectCycle(head *ListNode) *ListNode {
// 定义快慢指针
slow := head
fast := head
// 判断是否有环
for fast != nil && fast.Next != nil {
slow = slow.Next
fast = fast.Next.Next
if slow == fast {
break
}
}
// 如果没有环,返回nil
if fast == nil || fast.Next == nil {
return nil
}
// 从链表头和相遇点开始,寻找环的起始点
slow = head
for slow != fast {
slow = slow.Next
fast = fast.Next
}
return slow
}
func main() {
// 示例链表构建
node1 := &ListNode{Val: 3}
node2 := &ListNode{Val: 2}
node3 := &ListNode{Val: 0}
node4 := &ListNode{Val: -4}
node1.Next = node2
node2.Next = node3
node3.Next = node4
node4.Next = node2 // 制造一个环
result := detectCycle(node1)
if result != nil {
println("环的起始节点值为:", result.Val)
} else {
println("无环")
}
}