Golang循环链表:约瑟夫问题

package main

import (
"fmt"
)

//小孩
type boy struct {
id uint
next *boy
}
//游戏
type game struct {
head *boy
}
//用于初始化game结构体
func NewGame(num uint)*game{
game:=new(game)
game.createBoy(num)
return game
}
//创建num个小孩围成一个环形链表
func (game *game) createBoy(num uint) {
var i uint
var temp *boy
if num==0{//num为0就不创建了
return
}
if game.head!=nil{
return
}
for i = 1; i <= num; i++ {
if game.head==nil{//如果head为nil创建第一个boy
game.head = &boy{
id: i,
}
temp=game.head
temp.next=game.head
}else{//加入boy
temp.next= &boy{
id: i,
next: game.head,
}
temp = temp.next
}
}
}
//输出环形链表
func (game *game) ShowBoy() {
temp := game.head
if temp == nil {
fmt.Println("null")
return
}

for {
fmt.Printf("小孩编号=%d ->\n", temp.id)
if temp.next != game.head {
temp = temp.next
}else{
break
}
}
}
//开始游戏
func (game *game)PlayGame(start uint,num uint) *boy{
if game.head==nil||start==0||num==0{
return nil
}
var i uint
for i=1;i<start;i++{//找到start的位置
game.head=game.head.next
}

for{
for i=1;i<num-1;i++{
game.head=game.head.next
}
if game.head==game.head.next{//判断是否只剩下一个boy
return game.head
}
fmt.Println(game.head.next,"出圈")
game.head.next=game.head.next.next
game.head=game.head.next
}
}

func main() {
game:= NewGame(12)
game.ShowBoy()
game.PlayGame(2,3)
game.ShowBoy()
}

猜你喜欢

转载自www.cnblogs.com/blog1598558660/p/12461953.html