LinkedList 实现约瑟夫环
约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)
例:假设有80个小朋友手拉手围成一圈,由第一个小朋友开始从1开始数,数到3的小朋友退出,再从后面的小朋友从1数起,数到3的再退出,以此游戏下去,问最后剩下哪个小朋友?
用链表模拟如下图:
如图:假设长度为80个节点,每一个节点保存一个小朋友,从头开始数,每数3个,将第3个从链表中删除,然后从已删除节点的下一个位置开始再数3个,将第3个节点删除。如果遍历到链表尾部,则回到链表头继续,直到链表剩一个节点为止。
代码实现
public class Linked { public static void main(String[] args) { new Linked().child(); } public void child(){ //LinkedList是Java为我们提供的基于链表实现的集合 LinkedList<Integer> list = new LinkedList<>(); //向链表中添加80个节点 for(int i = 1; i <= 80; i++){ list.addLast(i); } int count = 0; //从零开始找,每次+1,count==3则清0; int cur = 80; //一共80个节点,找到一个,节点数减一 Integer num = null; //用来接收迭代出的元素 Iterator<Integer> it = list.iterator(); //创建迭代器 while(cur > 1){ //当前链表中的节点数大于1时,循环迭代 if(it.hasNext()){ num = it.next(); count++; //每迭代一次加1 }else{ //若果到链表尾部从新获得迭代器,重新在表头开始 it = list.iterator(); //获得新的迭代器对象 } if(count == 3){ //每次累加到第3个,将节点删除,计数器清零 count = 0; System.out.println("小孩"+num+"出圈"); it.remove(); cur--; } } System.out.println("最后一个小孩为:"+list.element()); //最后一个元素 } }