//数据类
class Child {
int no; //编号
Child nextChileChild = null; //指向下一个人
public Child(int no) {
this.no = no;
}
}
//链表类
//环形链表
class CycLink {
// 先定义一个指向链表第一个小孩的那个引用
// 指向第一个小孩的引用,不能动
Child firstChild = null;
Child temp = null;
int len = 0;// 表示共有几个小孩
int k;
int m;
// 设置链表大小
public void setLen(int len) {
this.len = len;
}
public void setK(int k) {
// 设置第几个人开始数数
this.k = k;
}
public void setM(int m) {
// 设置m
this.m = m;
}
public void play() {
// 1找到开始数数的人
Child temp = this.firstChild;
for (int i = 1; i < k; i++) {
temp = temp.nextChileChild;
}
// 数M下
while (this.len != 1) {
for (int j = 1; j < m; j++) {
temp = temp.nextChileChild;
}
Child temp2 = temp;// 找到要出圈的前一个小孩
// 讲数到M的小孩 退出圈
temp2=temp2.nextChileChild;
temp.nextChileChild=temp2.nextChileChild;
System.out.println("现在出圈的是" + temp2.no);
this.len--;
}
// 打印最优一个小孩
System.out.print("最后出圈的是:" + temp.no);
}
// 初始化链表
public void creatLink() {
for (int i = 1; i <= len; i++) {
if (i == 1) {
// 创建第一小孩
Child child = new Child(i);
this.firstChild = child;
this.temp = child;
} else {
if (i == len) {
Child child = new Child(i);
temp.nextChileChild = child;
temp = child;
temp.nextChileChild = this.firstChild;
} else {
// 继续创建小孩
Child child = new Child(i);
temp.nextChileChild = child;
temp = child;
}
}
}
}
public void show() {
Child temChild = this.firstChild;
do {
System.out.println(temChild.no + "###");
temChild = temChild.nextChileChild;
} while (temChild != this.firstChild);
}
}
//主方法类
public class Demo4 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CycLink cyclink =new CycLink();
cyclink.setLen(100);
cyclink.creatLink();
cyclink.setK(2);
cyclink.setM(2);
cyclink.show();
cyclink.play();
}
}