使用环行链表实现约瑟夫问题!!!

假设现在的问题为:假设现在有五个人围在一圈,从第一个人开始数,数到二的人出列。

  1. 将数据添加到链表中使其形成环状效果如下。

使用环行链表实现约瑟夫问题!!!_第1张图片
下面我们使用代码方式实现

/**
     * 链表实体
     */
    static class Body{
     
        //编号
        public int no;
        //next域
        public Body next;

        public int getNo() {
     
            return no;
        }

        public void setNo(int no) {
     
            this.no = no;
        }

        public Body getNext() {
     
            return next;
        }

        public void setNext(Body next) {
     
            this.next = next;
        }

        public Body(int no){
     
            this.no = no;
        }

        @Override
        public String toString() {
     
            return "Body{" +
                    "no=" + no +
                    '}';
        }
    }

static class util{
     
        private static Body fast = null;
        /**
         * 添加数,使链表实现环行
         * @param number
         */
        public static void add(int number){
     
            //创建辅助节点帮助实现环行
            Body temp = null;
            for (int i = 1;i <= number;i++){
     
                Body body = new Body(i);
                //第一个自我形成环状
                if(i == 1){
     
                    fast = body;
                    fast.setNext(fast);
                    temp = fast;
                }else{
     
                    //往后移动一位
                    temp.setNext(body);
                    //next指向第一个形成环状
                    body.setNext(fast);
                    temp = body;
                }
            }
        }
  1. 实现出列操作
    使用环行链表实现约瑟夫问题!!!_第2张图片
 /**
         *
         * @param startNo 从第几个开始数
         * @param countNum 数几次
         * @param nums
         */
        public static void countBoy(int startNo, int countNum, int nums){
     
            Body temp = fast;
           while(true){
     
               if(temp.getNext() == fast){
     
                   break;
               }
               temp = temp.getNext();
           }
            for (int i=0;i<startNo-1;i++){
     
                temp = temp.getNext();
                fast = fast.getNext();
            }

            while(true){
     
                if(temp == fast){
     
                    break;
                }
                //数的次数-1就是要出列的人
                for (int i=0;i<countNum-1;i++){
     
                    temp = temp.getNext();
                    fast = fast.next;
                }
                System.out.println("出圈的小孩"+fast.getNo());
                fast = fast.getNext();
                //取出后新的链表
                temp.setNext(fast);
            }
            System.out.println("在圈中的小孩"+fast.getNo());
        }

最后输出结果为:
使用环行链表实现约瑟夫问题!!!_第3张图片

你可能感兴趣的:(Java数据结构,java,链表,数据结构)