约瑟夫环问题--Java解

问题描述:

传送门
哈哈,拥有智慧的人总是能笑到最后。一起向他学习吧。
大致描述就是41个人,从第一个开始报数,谁报到3就原地爆炸,下一个继续从1开始数,如此往复。

解:

约瑟夫环可以看作一个单向循环列表,从头节点开始,把第三个节点删除,并将下一个节点作为头节点,如此往复,就可打印出爆炸顺序。
上代码

public class JosephCircle {
	//定义
    static class Node{
        int data;
        Node nextNode;
    }
    //初始化约瑟夫环:这边写死41,超逼真还原,哈哈。也可以作为将环长作为参数传进来。
    static Node initJsephCircle(){
        Node head = new Node();
        int i = 1;
        Node tempNode = new Node();
        while(i <= 41){
            Node currntNode = new Node();
            //记录第一个头节点
            if (i == 1){
                tempNode = currntNode;
            }
            currntNode.data = i++;
            head.nextNode = currntNode;
            head = currntNode;
        }
        //尾指向头
        head.nextNode = tempNode;
        return tempNode;
    }

    public static void main(String[] args){
        Node head = initJsephCircle();
        int count = 1;
        while (head.nextNode != null)
        {
        	//由于是单向链表,故数到2时就爆掉下一个3,并将下下个节点作为头节点。
            if(count == 2) {
                System.out.println(head.nextNode.data);
                head.nextNode = head.nextNode.nextNode;
                count = 1;
                head = head.nextNode;
                continue;
            }
            count++;
            head = head.nextNode;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值