题目:
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例:
输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。
解法一
分析:
第一种解法是使用map将经过的head都存进来,检查是否有重复的指针,如果有就是环状链表
答案:
func hasCycle(head *ListNode) bool {
//创建存指针的数组
m := make(map[*ListNode]int)
//遍历循环存指针
for head != nil {
//判断是否有,有就返回true
if _, exist := m[head]; exist{
return true
}
//存指针
m[head] = 1
//遍历到下一个指针
head = head.Next
}
return false
}
解法二
分析:
第二种解法是通过快慢指针的方式来解决问题,慢指针一次走一步,快指针一次走两步,这样快指针每次追慢指针一步,如果是环状链表这样就肯定在追一圈后重合
答案:
func hasCycle(head *ListNode) bool {
if head == nil {
return false
}
//双指针
f := head
s := head
//开始遍历
for f != nil && f.Next != nil {
f = f.Next.Next
s = s.Next
if s == f {
return true
}
}
return false
}