环形链表也叫循环链表(可以是双链表、也可以是单链表),操作原理和单链表差不多,只是最后一个节点不在指向空(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//报数清零

}

 

}

 

 

 

}