Java實現約瑟夫環

問題描述:N個人圍成一圈,從第一個人開始報數,報到m的人出圈,剩下的人繼續從1開始報數,報到m的人出圈;如此往復,直到所有人出圈。(模擬此過程,輸出出圈的人的序號)

定義Person類(單鏈表節點)

public class Person {
	public int id;
	public Person next;

	public Person(int id) {
  	 this.id = id;
    }
}

定義CircleSingleLinkedList類(循環鏈表以及其出圈方法)

public class CircleSingleLinkedList {
    public Person head;

    public CircleSingleLinkedList() {

    }

    /**
     * 添加孩子節點,侯建一個環形的鏈表
     * @param nums
     */
    public void addBoy(int nums){
        if(nums < 0){
            System.out.println("輸入人數有誤!");
            return;
        }

        Person cur = head;
        for(int i = 1;i <= nums;i++){
            Person node =  new Person(i);
            if(i == 1){
                head = node;
                node.next = head;
            }else{
                cur.next = node;
                node.next = head;
            }
            cur = node;
        }
    }

    /**
     * 遍歷當前的環形鏈表
     */
    public void showBoy(){
        if(head == null){
            System.out.println("當前圈圈沒有人");
            return ;
        }

        Person cur = head;
        while (true){
            System.out.println("小孩的編號"+cur.id);
            if(cur.next == head){
                break;
            }
            cur = cur.next;
        }
    }

    //根據用戶輸入,計算出小孩出圈的順序

    /**
     *
     * @param startNum 表示從第幾個小孩開始數數
     * @param countNum  表示數幾下
     * @param nums  表示最初有多少小孩在圈中
     */
    public void countBoy(int startNum,int countNum,int nums){
        if(head == null || startNum < 1 || startNum > nums){
            System.out.println("參數輸入有誤,請重新輸入!");
            return;
        }


        Person cur  = head;
        while(startNum -1 >0){
            cur = cur.next;
            startNum--;
        }

        Person prev = cur;
        while(true){
            if(prev.next == cur){
                break;
            }
            prev = prev.next;
        }

        while(true){
            if(prev == cur){
                break;
            }

            int count = countNum;
            while(count-1 > 0){
                prev = prev.next;
                cur = cur.next;
                count--;
            }

            System.out.println(cur.id);
            cur = cur.next;
            prev.next = cur;
        }

        System.out.println(cur.id);
    }


}

測試類:

public class TestCSLL {
    public static void main(String[] args) {
        CircleSingleLinkedList circle = new CircleSingleLinkedList();
        circle.addBoy(5);
        circle.showBoy();
        circle.countBoy(1,2,5);
    }
}

運行結果:

發佈了79 篇原創文章 · 獲贊 15 · 訪問量 2770
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章