//约瑟夫环形表
public class Josepfu {
public static void main(String[] args) {
// TODO Auto-generated method stub
JosepfuDemo demo = new JosepfuDemo();
demo.addBoy(5);
demo.Iteroter();
demo.out(1, 2, 5);
}
}
class JosepfuDemo {
private Boy first = null;
// 传入孩子数量
public void addBoy(int nums) {
Boy boyTemp = new Boy(0);
if (nums < 1) {
System.out.println("孩子数量异常");
}
for (int i = 1; i <= nums; i++) {
Boy boy = new Boy(i);
// 构造第一个节点
if (i == 1) {
first = boy;
first.setNext(boy);
boyTemp = boy;
} else {
boyTemp.setNext(boy);
boy.setNext(first);
boyTemp = boy;
}
}
}
public void Iteroter() {
if (first == null) {
System.out.println("链表为空");
return;
}
Boy tempBoy = first;
// 遍历约瑟夫链表
while (true) {
System.out.println(tempBoy.getNo());
if (tempBoy.getNext() == first) {
break;
}
// 后移
tempBoy = tempBoy.getNext();
}
}
// 孩子们开始出圈
// k is The first k personal
// m 是数几下
public void out(int k, int m, int nums) {
if (k < 0 || m < 1 || nums < 1) {
System.out.println("输入不正确");
return;
}
// 先创建一个辅助节点helper位于first的前面一位
Boy helperBoy = first;
while (true) {
if (helperBoy.getNext() == first) {
break;
}
helperBoy = helperBoy.getNext();
}
// 同时将first helper 移动到K的位置 即需要移动k-1次
for (int i = 0; i < k - 1; i++) {
first = first.getNext();
helperBoy = helperBoy.getNext();
}
while (true) {
// 这个时候圈里只剩下一个人
if (helperBoy == first) {
break;
}
// 进行出圈操作 需要移动m-1次
for (int j = 0; j < m - 1; j++) {
first = first.getNext();
helperBoy = helperBoy.getNext();
}
// 这时候 first就是出圈的人
System.out.println("出圈" + first.getNo());
first = first.getNext();
helperBoy.setNext(first);
}
System.out.println("出圈" + helperBoy.getNo());
}
}