package main
import (
"fmt"
"math/rand"
"time"
)
const len =10
type Node struct {
Data string
pNext *Node
}
//利用尾插法创建有环链表
func createLoop()(*Node,int){
if len<1 || len>26 {
return nil,-1
}
pHead:=new(Node)
pHead.pNext=nil
p,q:=pHead,pHead
rand.Seed(int64(time.Now().Nanosecond()))
d:= rand.Intn(len) //随机生成环的位置
if d==0 {
d=1
}
for i:=1;i<=len;i++{
pnew:=new(Node)
pnew.Data=string(65+i-1)
p.pNext=pnew
p=pnew
if i==d {
q=pnew
}
}
p.pNext=q
return pHead,d
}
//头插法建立单链表
func createList() *Node{
if len<1 || len>26{
return nil
}
pHead:=new(Node)
pHead.pNext=nil
for i:=1;i<=len;i++{
pnew:=new(Node)
pnew.Data=string(65+i-1)
pnew.pNext=pHead.pNext
pHead.pNext=pnew
}
return pHead
}
func traverse(list *Node){
var i=0
for p:=list.pNext;p!=nil && i<len*2;p=p.pNext {
fmt.Printf("%5s",p.Data)
if i==len-1 {
fmt.Println()
}
i++
}
fmt.Println()
}
//利用快慢指针判断链表是否存在环
func isloop(list *Node)(bool,int) {
p,q:=list.pNext,list
count:=0 //返回找出环提循环次数
for p!=nil && q!=nil {
count ++
q=q.pNext
if q!=nil {
q=q.pNext
}
if p==q && p!=nil {
return true,count
}
p=p.pNext
}
return false,-1
}
//内循环每次重新开始查找。
func hasLoop(list *Node)(bool,int){
cur:=0
for p:=list.pNext;p!=nil;p=p.pNext{
cur++
cur1:=0
for q:=list.pNext;q!=nil&&cur1<cur;q=q.pNext{
cur1++
if q==p && cur1!=cur{
return true,cur1
break
}
}
}
return false,-1
}
func main() {
loop,index:=createLoop()
fmt.Println("环的位置为:",index)
traverse(loop)
list:=createList()
//traverse(list)
re,index:=hasLoop(list)
fmt.Println(re,index)
re2,count:=hasLoop(loop)
fmt.Println(re2,"找出环用的位置",count)
}