(學習java)用java語言構造的迴圈連結串列解決約瑟夫問題
阿新 • • 發佈:2019-02-14
//josephus問題 41個人1-3報數,數到3的自殺,最後剩餘的2個人結點資料 public class Josephus { public static void main(String[] args) { SLineList s = new SLineList(); //定義人數m int m = 41; s.init(); //建立一個有m個結點的迴圈連結串列 for(int i=1;i<=m;i++){ s.addNode(i); } s.josephus(3); s.list(); } //定義結點類 public static class Node{ public int data; public Node next; public Node(){ } public Node(int data){ this.data = data; this.next = null; } } public static class SLineList{ //定義頭結點 private Node head; //定義尾結點 private Node rear; //定義連結串列長度 private int size; public void init(){ head = new Node(); rear = new Node(); head.next = rear; rear.next = head; size = 0; } //新增結點(尾插法) public void addNode(int data){ Node node = new Node(data); if(head.next == rear){ node.next = rear; head.next = node; size++; }else{ Node temp = head; while(temp.next != rear){ temp = temp.next; } node.next = rear; temp.next = node; size++; } } //迴圈連結串列的遍歷 public void list(){ if(head.next == rear){ System.out.println("空連結串列"); System.out.println("連結串列的長度" + size); }else if(head.next.next == rear){ System.out.println(head.next.data); System.out.println("連結串列的長度" + size); }else{ Node temp = head; while(temp.next.next != rear){ temp = temp.next; System.out.print(temp.data + "->"); } temp = temp.next; System.out.println(temp.data); System.out.println("連結串列的長度" + size); } } //josephus問題 41個人1-3報數,數到3的自殺,最後剩餘的2個人結點資料 public void josephus(int n){ int s = n-1; Node p = head; while(size != s){ for(int i=0;i<s;i++){ p = p.next; if(p == rear){ p = p.next.next; }else if( p == head){ p = p.next; } } if(p.next == rear){ p = p.next.next; Node temp = p.next; p.next = p.next.next; temp = null; size--; }else if(p == head){ p = p.next; Node temp = p.next; p.next = p.next.next; temp = null; size--; }else if(p == rear){ p = p.next.next; Node temp = p.next; p.next = p.next.next; temp = null; size--; }else{ Node temp = p.next; p.next = p.next.next; temp = null; size--; } } } } }