java数据结构-Josephu约瑟夫问题

约瑟夫问题,有n个人,从第k个开始报数,数到第m个,则该人出列,直到最后一个人为止,看这n个人出列的顺序。

1.定义一个helper结点,循环将helper指向first的后面一个结点;

2.先将指针,指到k的位置;

3.循环报数,当到达m时,跳出for循环,然后当前结点出列;

@paramn 结点个数

@paramk 第k个开始报数

@paramm 第m个为止,且出列。

    public void josephu(int n,int k, int m) {
        // 参数判断
        if (n <= 0 || k > n || m < 0) {
            System.out.printf("参数输入错误");
        }
        // 定义临时指针
        Boy helper;
        Boy temp1 = first;
        // 循环将helper指向first的后面一个结点
        while (true) {
            if (temp1.getNext() == first) {
                break;
            }
            temp1 = temp1.getNext();
        }
        helper = temp1;

        // 先将指针,指到k的位置
        for (int i = 1; i <= k; i++) {
            first = first.getNext();
            helper = helper.getNext();
        }
        System.out.println();

        // 循环报数,当到达m时,跳出for循环,然后当前结点出列
        while(true) {
            if (helper == first) {
                System.out.printf("最后出列的是:%d\r\n", first.getOn());
                break;
            }
            for (int i = 1; i <= m; i++) {
                first = first.getNext();
                helper = helper.getNext();
            }
            System.out.printf("当前出列的是:%d\r\n", first.getOn());
            first = first.getNext();
            helper.setNext(first);
        }
    }

版权声明:本文为weixin_51730356原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。