马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//作者:铁头娃鸭
//日期:2020.6.9
//作用:实现约瑟夫环
public class work6{
public static void main(String args[]){
CycLink cyclink=new CycLink();
cyclink.setlen(8);//长度
cyclink.setk(4);//从第几个小孩开始数
cyclink.setm(4);//数多少下
cyclink.create_link();
cyclink.show();
cyclink.play();
}
}//小孩的类
class Child {
//编号
int no;
//暂时不知道指向那个孩子所以置空,
Child nextchild=null;
public Child (int no){
this.no=no;
}
}
//环形链表
class CycLink{
// 先定义一个指向链表第一个小孩的的引用(头结点)
Child first_child=null;
Child temp=null;//跑龙套的temp
Child tem=null;//跟着跑龙套的后面的
int len=0;//表示共有几个小孩
int k=0;//从第几个小孩开始数
int m;//数多少下
//开始创建小孩
public void create_link(){
for(int i=1; i<=len;i++){
if(i==1){ //创建第一个小孩
Child ch=new Child(i);
this.first_child=ch;
this.temp=ch;
}
else {
if (i==len){//最后一个小孩
Child ch=new Child(i);
temp.nextchild=ch;
temp=ch;
temp.nextchild=this.first_child;
}
else {//其余小孩
Child ch=new Child(i);
temp.nextchild=ch;
temp=ch;
}
}
}
}
//开始游戏
public void play(){
//让tem指向第一个小孩的后面,也就是最后一个小孩(本意就是让tem一直跟在temp后面,这样方便施行让小孩退圈的操作)
this.tem=this.first_child;
for(int j=1; j<len;j++){
tem=tem.nextchild;
}
Child temp=this.first_child;
//1找到数数的人从第k个小孩开始数
for (int i=1;i<k;i++){
tem=tem.nextchild;
temp=temp.nextchild;
}
//数m下;
while(len!=1){
for (int i=1;i<=m;i++){
tem=tem.nextchild;
temp=temp.nextchild;
}
//将数到m下的小孩退出圈
System.out.print("推出圈的小孩:"+temp.no+" ") ;
tem.nextchild=temp.nextchild;
temp=temp.nextchild;
len--;
}
System.out.println(" "+temp.no);
}
//初始化循环链表
public void setk(int k){
this.k=k;
}
public void setm(int m){
this.m=m;
}
public void setlen (int len){
this.len=len;
}
public void show(){
Child temp1=this.first_child;
do{
System.out.print(temp1.no);
temp1=temp1.nextchild;
}while (temp1!=first_child);
}
}
|