问题描述: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