问题:设编号为1、2……n的几个小孩围坐一圈,约定编号为k(1=<k<=n)的小孩从1开始报数,数到m的那个出列,他的下一位又从1开始报数,数到m的那个人又出列,直到所有人出列为止,由此产生一个出队编号的序列。
package com.test;
public class Test {
public static void main(String[] args) {
CycLink cycLink=new CycLink(5);
cycLink.show();
cycLink.setK(2);
cycLink.setM(3);
cycLink.play();
}
}
//每个节点小孩
class Child{
int no;//小孩编号
Child nextChild;//下一个节点信息
Child previousChild;//上一个节点信息
public Child(int no){
this.no=no;
}
}
//小孩围成一个环,循环链表
class CycLink{
int len;//有几个小孩
Child firstChild;//第一个小孩
Child cursor;//临时变量
int k;//编号为K
int m;
public CycLink(int len){//初始化循环链表
this.len=len;
for(int i=1;i<=len;i++){
Child ch=new Child(i);//创建小孩
if(i==1){
firstChild=ch;
cursor=ch;
}else {
if(i==len){
cursor.nextChild=ch;
ch.previousChild=cursor;
cursor=ch;
ch.nextChild=firstChild;
firstChild.previousChild=ch;
}else {
cursor.nextChild=ch;
ch.previousChild=cursor;
cursor=ch;
}
}
}
}
//打印链表
public void show(){
cursor=firstChild;
do {
System.out.print("--"+cursor.no);
cursor=cursor.nextChild;
} while (cursor!=firstChild);
}
//开始游戏
public void play(){
Child temp;
cursor=firstChild;
//1.找到编号为K的人
for(int i=1;i<k;i++){
cursor=cursor.nextChild;
}
//2.找到数到M的人
while (len>1) {
for(int j=1;j<m;j++){
cursor=cursor.nextChild;
}
System.out.println("小孩"+cursor.no+"出局了");
//3.数到M的人退出游戏
temp=cursor.previousChild;//找到推出人的前一个人
temp.nextChild=cursor.nextChild;
cursor.nextChild.previousChild=temp;
cursor=cursor.nextChild;
len--;
}
System.out.println("最后一个出局的"+cursor.no);
}
//编号为K的开始报数
public void setK(int k){
this.k=k;
}
//
public void setM(int m){
this.m=m;
}
}