zoukankan      html  css  js  c++  java
  • 判断单向链表是否为环形链表-基于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
    }
    
  • 相关阅读:
    高一下期末考试划水记
    BZOJ 1053
    积性函数与狄利克雷卷积(未完待更)
    Contest Hunter 3101
    POJ2689
    3.17爆零赛
    全概率公式
    矩阵快速幂
    模板练习
    _rqy's Code Style for OI
  • 原文地址:https://www.cnblogs.com/pangqianjin/p/14629922.html
Copyright © 2011-2022 走看看