1. 程式人生 > 其它 >單向環形連結串列解決約瑟夫環

單向環形連結串列解決約瑟夫環

單項環形連結串列介紹

是一種物理儲存單元上非連續,非順序的儲存結構(能有效利用記憶體碎片)。資料的邏輯順序通過連結串列中的指標來實現。

約瑟夫(Josephus)問題

設編號為1,2,...n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人都出列為止,由此產生一個出佇列編號的序列。

程式碼實現(提示:需要兩個指標操作)

public class Josephu {
    public static void main(String[] args) {
        AnnularLinkedList linkedList = new AnnularLinkedList();
        linkedList.add(5);
        linkedList.show();
        linkedList.countNode(5,2,3);
    }
}

class AnnularLinkedList{
    //第一個節點
    private Node first = null;
    //臨時指標變數
    private Node temp = null;

    /**
     * 新增節點
     */
    public void add(int count){
        if (count < 1){
            System.out.println("傳入的數量不正確");
            return;
        }
        for (int i=1;i<=count;i++){
            Node node = new Node(i);
            if (i == 1){
                first = node;
                first.setNext(first);
                temp = first;
            }else {
                temp.setNext(node);
                node.setNext(first);
                temp = node;
            }
        }
    }

    public void show(){
        temp = first;
        while (true){
            if (temp.getNext() == first){
                System.out.println(temp.getVal());
                break;
            }
            System.out.println(temp.getVal());
            temp = temp.getNext();
        }
    }

    public void countNode(int totalNo ,int startNO, int num){
        //新增節點
        add(totalNo);
        temp = first;

        //約定編號為k的人
        while (true){
            if (temp.getVal() == startNO){
                first = temp;
                break;
            }
            temp = temp.getNext();
        }

        while (true){
            if (temp.getNext() == temp){
                break;
            }
            for (int i = 1; i < num; i++) {
                temp = first;
                first = first.getNext();
            }
            System.out.println("當前節點為:"+first.getVal());
            //進行節點去除
            temp.setNext(first.getNext());
            first = temp.getNext();
        }
        System.out.println("最後一個節點為:"+first.getVal());
    }
}

class Node{
    private int val;
    private Node next;

    public Node(int val) {
        this.val = val;
    }

    public int getVal() {
        return val;
    }

    public void setVal(int val) {
        this.val = val;
    }

    public Node getNext() {
        return next;
    }

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