package main
import (
"fmt"
)
//假设是一群小孩在玩这个游戏
//创建一个小孩的结构体
type BoyNode struct {
No int //给每个小孩一个唯一的身份编号
next *BoyNode //指向下一个小孩
}
//假设有number个小孩在玩游戏
func AddBoyNode(number int) *BoyNode {
head := &BoyNode {} //先创建一个头节点
temp := &BoyNode {} //创建一个辅助节点
for i := 1; i<= number; i++ {
boy := &BoyNode {
No : i,
}
if i == 1 {
head = boy
temp = boy
temp.next = head
} else {
temp.next = boy
temp.next.next = head
}
temp = temp.next
}
return head
}
//开始游戏
func Play(head *BoyNode, a, b int) *BoyNode {
temp := head //辅助节点指向头节点head
helper := head //辅助节点指向链表最后的节点
//判断如果没有小孩无法游戏
if temp.next == nil {
fmt.Println("没有小孩,无法进行游戏!")
return head
}
//小孩只剩一个的时候退出游戏
if temp.next == head {
fmt.Println("只有一个小孩了,游戏结束!最后一个小孩为:")
return head
}
//将helper指向最后一个小孩
for {
if helper.next == head {
break
}
helper = helper.next
}
//循环找到从第a个小孩开始游戏
for {
if temp.No == a {
break
}
temp = temp.next
helper = helper.next
}
//数到b时出列的小孩
for i := 1; i < b; i++ {
temp = temp.next
helper = helper.next
}
//如果该小孩是第一个小孩,则将头节点指向下一个小孩
if temp == head {
head = head.next
}
helper.next = temp.next
fmt.Println()
fmt.Printf("小男孩:%d出列!",temp.No)
fmt.Println()
ListBoyNode(head)
//下一次游戏从第a个小孩开始
a = temp.next.No
return Play(head,a,b)
}
//输出显示链表
func ListBoyNode(head *BoyNode) {
temp := head
for {
fmt.Printf("小男孩:%d ==>",temp.No)
temp = temp.next
if temp == head {
break
}
}
}
func main() {
fmt.Println("请输入有多少个小孩玩游戏:")
var number int
fmt.Scan(&number)
head := AddBoyNode(number)
ListBoyNode(head)
fmt.Println("请输入从第几个小孩开始游戏:")
var a int
fmt.Scan(&a)
fmt.Println("请输入数几的小男孩出列:")
var b int
fmt.Scan(&b)
head = Play(head,a,b)
ListBoyNode(head)
}