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

Java环形链表--约瑟夫问题

2017-03-19 21:06 459 查看
n个小孩围成圈,丢手帕,从第start个小孩开始丢,每到第step个小孩出局;接着从下一个小孩开始,直到最后一个小孩为止,游戏结束。

/**
* @author Jiaozl
*  CycLink cyclink = new CycLink();
*  cyclink.setLen(5);
*  cyclink.createLink();
*  cyclink.setStart(2);
*  cyclink.setStep(2);
*  cyclink.show();
*  cyclink.play();
*/
public class CycLink {

Child firstChild = null; // 指向链表第一个小孩的引用
Child temp=null;
int len = 0; // 表示公有几个小孩
int start = 0;
int step = 0;

/**
* 设置链表的大小
*/
public void setLen(int len) {
this.len = len;
}
/**
* 设置从第几个人开始数数
*/
public void setStart(int start) {
this.start = start;
}
/**
* 设置step
*/
public void setStep(int step) {
this.step = step;
}

/**
* 开始play
*/
public void play() {

Child temp = this.firstChild;

// 先找到开始数数的人
for(int i=1; i<=start-1; i++) {
temp = temp.nextChild;
}
while(this.len!=1) {
// 数m下
for (int i = 1; i < step; i++) {
temp = temp.nextChild;
}
Child temp2 = temp;
while (temp2.nextChild!=temp) {
temp2 = temp2.nextChild;
}
// 将疏导step的小孩,退出圈圈
temp2.nextChild = temp.nextChild;
temp = temp.nextChild;
this.len--;
}

System.out.println("最后剩下的小孩:" + temp.no);
}
/**
* 初始化环形链表
*/
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;
temp = ch;
temp.nextChild = this.firstChild;
} else {

Child ch = new Child(i);
temp.nextChild = ch;
temp = ch;
}
}
}
}

/**
* 打印环形链表
*/
public void show() {
Child temp = this.firstChild;
do{
System.out.print(temp.no + " ");
temp = temp.nextChild;
} while(temp!=this.firstChild);
}

}

class Child{
int no;
Child nextChild = null;
public Child(int no) {
this.no = no;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: