java環形連結串列約瑟夫環問題筆記

英俊男孩發表於2020-12-24

約瑟夫環問題
設編號1,2,3…n的n個人圍坐一圈,從編號為k的人從1開始報數,數到m的人出列。他的下一位繼續從1開始報數,數到m的人出列,以此類推,直到所有人出列位置,由此產生一個出隊編號的序列。
使用不帶頭結點的迴圈連結串列處理該問題、

package f1;

public class g1{
		public static void main (String []args) {
	// n=5 五個人 k=1從第一個人開始報數  m=2數兩下
			CircleSingleLinkedList List = new CircleSingleLinkedList();
			List.addnode(8);
			List.ysf(1, 2);
		}
}     
class CircleSingleLinkedList{
	private node first =new node(-1);  //頭結點 
	public void addnode(int num) {
		//建立num個節點的環形連結串列
		node temp,curnode=first;
		for(int i=0; i<num;i ++) {
			temp = new node(i+1);
			curnode.next = temp;
			temp.next = first;
			curnode = temp;
		}
	}
	public void showlist() {
		node temp = first ;
		while(true) {
			if(temp.next == first) break;
			temp = temp.next ;
			System.out.println(temp.No);
		}
	}
	public void ysf(int k,int m) {
			node temp = first,helper=null; 
			int u=m;
			while(k-- > 0) {
				helper  = temp;
				temp = temp.next;
			}
			while(true) {
				if(temp == helper){
					//System.out.println(temp.No);
					break;
				}
				while(m-- > 0) {
					helper  = temp;
					temp = temp.next;
					if(temp == first) {
						helper  = temp;
						temp = temp.next;
					}
				}
				m=u;
				if(temp.No != -1)
				System.out.println(temp.No);
				helper.next = temp.next;
			}
	}
}
//建立第一個節點,讓first指向該節點
//沒建立新的節點就把該節點加入到已有的環形連結串列中
class node{
	public int No;
	public node next;
	public node(int no) {
		this.No = no;
	}
}

相關文章