1. 程式人生 > >(學習java)用java語言構造的迴圈連結串列解決約瑟夫問題

(學習java)用java語言構造的迴圈連結串列解決約瑟夫問題

//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--;
					}
					
				}
				
				
				
			}
			
		}

}