判断单向链表是否为环形链表-基于Go

给定一个链表,判断链表中是否有环。
如果链表中存在某个节点,可以通过连续跟踪next指针再次到达该节点,则链表中存在环。
如果链表中存在环,则返回true,否则返回false。

  • 直接遍历链表,使用set做标记位(标记是否已经到达过)
package main

import (
	"fmt"
)

type Node struct{
	val int
	next *Node
}
type void struct{}

func hasCycle(head *Node)bool{
	set := map[Node]void{}
	for head!=nil{
		_, ok := set[*head]
		if ok{
			// 已经存在了一个相同的Node
			return true
		}
		// 此Node在set中不存在
		set[*head] = void{}
		head = head.next
	}
	return false
}

func main(){
	node5 := Node{5, nil}
	node4 := Node{4, &node5}
	node3 := Node{3, &node4}
	node2 := Node{2, &node3}
	node1 := Node{1, &node2}
	node5.next = &node3
	fmt.Println(hasCycle(&node1))
}
  • 使用双指针
func hasCycle(head *ListNode) bool {
    if head==nil||head.Next==nil{
		return false
    }

	slow := head
	quick := head
	for quick!=nil && quick.Next!=nil{
                slow = slow.Next
		quick = quick.Next.Next

		if quick==slow{
			return true
		}	     
	}

	return false
}
原文地址:https://www.cnblogs.com/pangqianjin/p/14629922.html