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;
}
}