アルゴリズム-ジョセフ問題

package org.structure.linkedList;

/**
 * 约瑟夫问题
 * @author cjj_1
 * @date 2020-08-04 17:35
 */
public class SingleCircleLinkedListDemo {
    public static void main(String[] args) {
        SingleCircleDemo node1 = new SingleCircleDemo(1,"鲁智深","鲁达");
        SingleCircleDemo node4 = new SingleCircleDemo(4,"王五","55");
        SingleCircleDemo node2 = new SingleCircleDemo(2,"张三","ss");
        SingleCircleDemo node3 = new SingleCircleDemo(3,"李四","44");
        SingleCircleDemo node5 = new SingleCircleDemo(5,"吴六","66");
        SingleCircleLinkedList list = new SingleCircleLinkedList();
//        list.add(node1);
//        list.add(node3);
//        list.add(node2);
//        list.add(node4);
//        list.add(node5);
        list.yuesefu(2,2,30);
    }
}
class  SingleCircleLinkedList{
    SingleCircleDemo yusef ;
//    //第m个出列
//    int m ;
//   public SingleCircleLinkedList(int m){
//       this.m = m;
//   }
    /**
     * 增加节点,形成环状
     * @param node
     */
    public  void add(SingleCircleDemo node){
        //环形链表
        if(yusef==null){
            yusef = node;
            yusef.next = yusef;
            return;
        }
        SingleCircleDemo temp = yusef;
        //找到最后一个节点
        while (temp.next != yusef)
            temp = temp.next;
        temp.next=node;
        node.next = yusef;
    }
    /**
     * 增加sum个节点,形成环状
     * @param sum
     */
    public  void add(int sum){
        int i=0;
        if(sum<1)
           return;
        SingleCircleDemo temp = null;
        while (i<=sum-2){
            if(yusef==null){
                yusef = new SingleCircleDemo(i,String.valueOf(i),String.valueOf(i));
                yusef.next = yusef;
                temp = yusef;
            }else {
                temp.next =new SingleCircleDemo(i,String.valueOf(i),String.valueOf(i));
                temp = temp.next;
            }
            i++;
        }
        temp.next = new SingleCircleDemo(i,String.valueOf(sum-1),String.valueOf(sum-1));
        temp.next.next = yusef;
    }
    //第m个出队
    public void yuesefu(int m){
        if(yusef == null)
            return;
        int num = 0;
        //第一个节点
        SingleCircleDemo first = yusef;
        SingleCircleDemo helper = first.next;
        while (first != null){
            if(num==(m-1)){
                //回收helper
                System.out.println(num +":"+ helper.toString());
                if(helper == first){
                    first =null;
                    break;
                }
                first.next = helper.next;
                first = helper.next;
                helper = first.next;
                num =0;
            }else {
                first = helper;
                helper = helper.next;
                num++;
            }

        }

    }

    /**
     * 约瑟夫升级版本(指定开始编号,指定总的)
     * @param startno 开始计数的num
     * @param countmum 计数num
     * @param sumnum 总共的num
     */
    public void yuesefu(int startno,int countmum,int sumnum){
        add(sumnum);
        if(yusef == null)
            return;
        if(startno <= 0 || startno > sumnum || countmum<=0)
            return;
        //定义两个指针变量
        SingleCircleDemo first = yusef;
        SingleCircleDemo helper = first;
        //复制helper 为 队列中的最后一个节点
        while (first != helper.next){
            helper = helper.next;
        }
        //startno开始数,让first指向第startno个节点
        for(int i =0;i<startno-1;i++){
            first = first.next;
            helper = helper.next;
        }
        //第countnum个出队

        int num = 0;
        //第一个节点
        while (first != null){
            if(num==(countmum-1)){
                //回收helper
                System.out.println(num +":"+ helper.toString());
                if(helper == first){
                    first =null;
                    break;
                }

                helper.next = first.next;
                first = helper.next;
                num =0;
            }else {
                first = first.next;
                helper = helper.next;
                num++;
            }

        }

    }

}
class  SingleCircleDemo{
    int no;
    String name;
    String nickName;
    SingleCircleDemo next;
    public SingleCircleDemo(int no,String name,String nickName){
        this.no =no;
        this.nickName = nickName;

    }

    @Override
    public String toString() {
        return "SingleCircleDemo{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}

おすすめ

転載: blog.csdn.net/weixin_40128696/article/details/107819978