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()); //最后一个元素
    }
}
全部评论

相关推荐

冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务