單向環形連結串列解決約瑟夫環
阿新 • • 發佈:2021-09-15
單項環形連結串列介紹
是一種物理儲存單元上非連續,非順序的儲存結構(能有效利用記憶體碎片)。資料的邏輯順序通過連結串列中的指標來實現。
約瑟夫(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; } }