使用LinkedList实现约瑟夫环

来源:互联网 发布:c#sql select 的返回值 编辑:程序博客网 时间:2024/06/11 01:25

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