ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-07 22:36:04  阅读:140  来源: 互联网

标签:Node head nil 单向 next 链表 quick 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 hasCycle2(head *Node)bool{
	if head==nil||head.next==nil{
		return false
	}

	slow := head
	quick := head.next
	for slow!=quick{
		if quick==nil||quick.next==nil{
			return false
		}
		slow = slow.next
		quick = quick.next.next
	}

	return true
}

标签:Node,head,nil,单向,next,链表,quick,Go
来源: https://www.cnblogs.com/pangqianjin/p/14629922.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有