约瑟夫问题:
利用环形链表
public class hello {
public static void main(String args[]) {
CycLink test=new CycLink();
test.setLen(5);
test.createLink();
test.setM(2);
test.setStart(2);
test.show();
test.play();
}
}
//结点
class Child
{
int no;
Child nextChild=null;
public Child (int no)
{
this.no=no;
}
}
//环形链表
class CycLink
{
//先定义一个指向链表第一个小孩的引用
//指向第一个小孩的引用
Child firstChild=null;
Child temp =null;
int len=0;//表示共有几个小孩
int start;
int m;
//设置数到m下
public void setM(int m){
this.m=m;
}
//设置从第几个开始数数
public void setStart(int start){
this.start=start;
}
//设置链表大小
public void setLen(int len)
{
this.len=len;
}
//初始化环形链表
public void createLink(){
for(int i=1;i<=len;i++)
{
if(i==1)
{
//创建第一个小孩
Child ch = new Child(i);
this.firstChild=ch;
this.temp=ch;//当前指针指向
}
else if(i!=len)
{//创建第二个小孩
Child ch=new Child(i);
temp.nextChild=ch;
this.temp=ch;
}
else{
Child ch=new Child(len);
temp.nextChild=ch;
temp=ch;
temp.nextChild=firstChild;
}
}
}
public void show(){
//定义一个跑龙套
Child temp=this.firstChild;
do{
System.out.println(temp.no);
temp=temp.nextChild;
}while (temp!=firstChild);
}
public void play() {
Child temp = this.firstChild;
//1,先找到开始数数的人
for (int i = 1; i < start; 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;
}
temp2.nextChild = temp.nextChild;
//让temp指向下一个数数的小孩
temp = temp.nextChild;
this.len--;
}
System.out.println("the last one "+temp.no);
}
}