golang之链表环的检测实现

判断链表中是否有环

package other_pratice

/**
*
* 判断链表中是否有环
*
* Author: sxy
 */

//  两种解发
//  1.快、慢指针法:
//  快指针一次走两格,慢指针一次走一格;如果不存在环,快指针指向nil时,
//  表示已经遍历完毕;如果存在环,则这两个指针会相遇.

func LinkedLoopDetection(node *NodeList) bool {
	if node == nil || node.next == nil {
		return false
	}
	head := NewNode(0)
	head.next = node
	slow := node
	fast := node

	for fast != nil && fast.next != nil {
		fast = fast.next.next
		slow = slow.next
		if fast == slow {
			return true
		}
	}

	return false
}

//  2. 足迹法
//  把每一次遍历的结果都记录在一个散列表中,如果存在,则即是有环

func LinkedLoopDetection1(node *NodeList) bool {
	if node == nil || node.next == nil {
		return false
	}

	nodeMap := make(map[*NodeList]int, 0)
	index := 1

	for node != nil && node.next != nil {
		if nodeMap[node] != 0 {
			return true
		} else {
			nodeMap[node] = index
			index++
		}
	}

	return false
}

测试

package other_pratice

import (
	"fmt"
	"testing"
)

func TestLinkedLoopDetection(t *testing.T) {

	a := NewNode(0)
	b := NewNode(2)
	c := NewNode(5)

	a.next = b
	b.next = c
	c.next = a

	res := LinkedLoopDetection1(a)
	fmt.Println(res)
}

outPut: 有环

=== RUN   TestLinkedLoopDetection
true
--- PASS: TestLinkedLoopDetection (0.00s)
PASS

你可能感兴趣的:(数据结构和算法相关)