约瑟夫问题

约瑟夫问题

Josephu问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号k(1<=k<=n)的人从 1 开始报数,数到m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

利用环链表来解决约瑟夫问题,出列对应将节点从链表中删除。

思路分析

   public void count(int k, int m, int nums) {
        //数据校验
        if (head == null || k < 1 ) {
            System.out.println("输入有误");
            return;
        }
        //定义辅助变量,进行遍历
        Node help = head;
        //判断help是否是指向化环形链表的最后一个位置
        while (true) {
            if (help.next == head) {//已经找到了链表最后一个位置
                break;
            }
            help=help.next;
        }
        //从k个数开始数,则head,temp需要移动k-1次
        for(int i=0;i<k-1;i++){
            head=head.next;
            help=help.next;
        }
        //移动m次出圈,直到环形数组中只有一个节点时,需要利用while()
        while(true){
            if(help==head){//圈中只有一个节点
                break;
            }
            for(int j=0;j<m-1;j++){
                head=head.next;
                help=help.next;
            }
            //这是head指向的节点就是要出圈的节点
            System.out.println("出圈的编号为"+head.No);
            head=head.next;
            help=head;
        }
        System.out.println("留在圈中的编号"+head.No);
    }
posted @ 2020-12-29 19:04  胡木杨  阅读(156)  评论(0)    收藏  举报