您的位置:首页 > 编程语言 > Java开发

约瑟夫问题(Josephus)java链表解决

2010-12-27 10:02 579 查看
/*设编号为12、、、、nN个人围成一圈,约定编号为K1<K<n)的人开始从1开始报数,数到M的那个人出列,她的下一位从1开始报数,数到M的那个人出列,以此类推,直到所有人出列算出最后一个出列的?*/

以下是源码:

package com.ym;//包自己引这是我的
public class demo3 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Cyclink Cyclink=new Cyclink();
Cyclink.Setlen(4);
Cyclink.createLink();
Cyclink.setM(2);
Cyclink.setk(2);
Cyclink.show();
Cyclink.play();
}

}
//创建小人小孩只有编号
class Child{
int no;
Child nextChild=null;
public Child(int no){
//给一个编号
this.no=no;
}
}
//首先创建环形链表
class Cyclink{
public static int setk;
//先定义一个指向第一个孩子的引用
//指向第一个小还得引用不能用fristChild
Child fristChild=null;
//定义游标负责链接
Child temp=null;
int len=0;//表示共有多少小孩初始化为0
int k=0;
int m=0;
public void setM(int m){
this.m=m;
}
//从第几个人开始数数
public void setk(int k){
this.k=k;
}
//设置环形链表的大小
public void Setlen(int len){
this.len=len;
}
//开始paly
public void play(){
Child temp=this.fristChild;
//开始找到数数的人
for(int i=1;i<k;i++){
temp=temp.nextChild;
}
while(this.len!=1){
//熟M下
for(int j=1;j<m;j++){
temp=temp.nextChild;
}
Child temp2=temp;
//找到要出圈的小孩
while(temp2.nextChild!=temp){
temp2=temp2.nextChild;
}
//将数到M的小孩踢出去
temp2.nextChild=temp.nextChild;
temp=temp.nextChild;
this.len--;
}
System.out.print("最后剩下"+temp.no);

}
//初始化环形链表设定环形链表的大小
public void createLink(){
for(int i=1;i<=len;i++){
//创建第一个小孩
if(i==1){
Child ch=new Child(i);
this.fristChild=ch;
this.temp=ch;
}else{
if(i==len){
Child ch=new Child(i);
temp.nextChild=ch;
temp=ch;
temp.nextChild=this.fristChild;
}else{
Child ch=new Child(i);
temp.nextChild=ch;
temp=ch;
}

}
}
}
//下面是验证输出地是否有效
public void show(){
Child temp=this.fristChild;
do{
System.out.print(temp.no);
temp=temp.nextChild;
}while(temp!=this.fristChild);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: