1. 程式人生 > >鏈表下的約瑟夫環

鏈表下的約瑟夫環

eno 鏈表 lis main brush return invalid lin java

首先把上面的雙向鏈表改為循環雙向鏈表

public class MyLinkedList2<E> {

    /**
     * 第一個
     */
    transient MyNode first = null;
    /**
     * 最後一個
     */
    transient MyNode last = null;

    transient int size =0;

    Object[] obs = null;

    MyLinkedList2(Object[] obs){
        this.obs = obs;
        MyNode preNode = null;
        for (int i = 0; i < obs.length; i++) {
            MyNode succ = new MyNode(preNode,(E)(obs[i]),null);

            if(preNode!=null){
                preNode.next=succ;
            }else {
                first=succ;
            }
            preNode = succ;
            last=succ;
            size++;
        }

        last.next=first;
        first.pre=last;

    }

    class MyNode{
        E w;
        MyNode pre = null;
        MyNode next=null;

        public MyNode(MyNode pre,E w, MyNode next) {
            this.w = w;
            this.next = next;
            this.pre=pre;
        }
    }

    public int length(){
        return size;
    }

}

  編碼實現約瑟夫環

/**
 * 環形鏈表解決約瑟夫環問題(間隔為3)
 */
public class Test3 {

    public static final int INVALID_DATA=-1;

    public static final int SPACE=3;

    public static void main(String[] args) {

        Object[] obs = new Object[10];
        for (int i = 0; i < obs.length; i++) {
            obs[i]=i;
        }


        MyLinkedList2.MyNode node = new MyLinkedList2(obs).first;
        int point = 0;
        while (node.next!=null){

            if((int)node.w != INVALID_DATA){
                if(point==SPACE){
                    System.out.println(node.w);
                    //INVALID_DATA
                    node.w=INVALID_DATA;
                    point=0;

                }else {
                    point++;
                }
            }
            node=node.next;
        }
    }
}

  

鏈表下的約瑟夫環