环形链表也叫循环链表(可以是双链表、也可以是单链表),操作原理和单链表差不多,只是最后一个节点不在指向空(null)而是头(head),这里以单链表举例:
二.代码实现约瑟夫问题
1)构建一个单向的环形链表思路
先创建第一个节点,让first指向该节点,并形成环形
后面当我们每创建一个新的节点,就把该节点加入到已有的环形链表中即可。
2)遍历环形链表
先让一个辅助指针(变量)curBoy,指向first节点
然后通过一个while循环遍历该环形链表即可,curBoy.next == first结束
5. 约瑟夫问题小孩出圈的思路分析
packagemain
import(
"container/ring"
"fmt"
)
typePlayerstruct{
posint//位置
alivebool//是否活着
}
const(
playerCount=39
startpos=1
deadline=3
)
funcmain(){
r:=ring.New(playerCount)
fori:=startpos;i<=playerCount;i++{//循环加载
r.Value=&Player{i,true}
r=r.Next()
}
ifstartpos>1{
r=r.Move(startpos-1)
}
counter:=1//从第一个开始,报数
deadCount:=0//死亡数量
fordeadCount<playerCount{//没有死光,继续
r=r.Next()//跳到下一个
ifr.Value.(*Player).alive{
counter++
}
ifcounter==deadline{//3,这个人挂掉
r.Value.(*Player).alive=false
fmt.Printf("Player%d被扔进大海\n",r.Value.(*Player).pos)
deadCount++//死亡一个
counter=0//报数清零
}
}
}