问题描述:20只猴子围成一圈,从1开始报数,报到第14的那只猴子退出圈外,并重新开始计数,直到圈中只剩下一只猴子,就是大王。
代码如下:
import java.util.Iterator;
import java.util.LinkedList;
/**
* @author huamanxi
* 用LinkedList实现约瑟夫环
*/
public class DemoLinkedList{
public static void main(String[] args) {
//创建一个元素类型为Integer类型的链表
LinkedList<Integer> monkeys=new LinkedList<>();
int number,cnt;
//将猴子的编号依次放到链表中
for(number=1;number<=20;number++){
monkeys.addLast(number);
}
//用于控制循环,当cnt为1时,退出循环
cnt=20;
//用于计数,当数到14时,删除对应的猴子
number=0;
Iterator it=monkeys.iterator();
//当剩下的猴子的个数大于1时,一直让猴子出圈
Integer num = null;
while(cnt>1){
if(it.hasNext()){
num=(Integer)it.next();
number++;
}else{
//迭代器已到达末尾,重新将它置回到链表头部
it=monkeys.iterator();
}
//删除应该退出圈外的猴子
if(number==14){
//从要删除的这个猴子的下一个开始重新计数
number=0;
System.out.println("编号为"+num+"的猴子出圈");
it.remove();
cnt--;
}
}
//最后剩下的就是大王
System.out.println("大王的编号为:"+monkeys.element());
}
}
运行结果:
删除编号为14的猴子
删除编号为8的猴子
删除编号为3的猴子
删除编号为19的猴子
删除编号为16的猴子
删除编号为13的猴子
删除编号为12的猴子
删除编号为15的猴子
删除编号为18的猴子
删除编号为2的猴子
删除编号为7的猴子
删除编号为20的猴子
删除编号为10的猴子
删除编号为9的猴子
删除编号为17的猴子
删除编号为6的猴子
删除编号为1的猴子
删除编号为5的猴子
删除编号为4的猴子
大王的编号为:11