1. 程式人生 > >約瑟夫問題(鏈式結構)

約瑟夫問題(鏈式結構)

package Linear;
/*
 * (鏈式結構)
 * 約瑟夫問題:n個人圍坐在一張桌子上,從第s個人開始數,數第m個人,該人出局。
 * 			    從下一個人開始數,數第m個人,該人出局。。。迴圈往復直至所有人出局
 */
public class K {
	public static void yuesefuTwo(Node h,int n,int s,int m) {
		int i=0;
		Node p =h;
		Node pre=h;		//pre永遠指向p的前一結點
		while (i<s) {
			p=p.next;
			i++;
		}
		while (pre.next!=p) {
			pre=pre.next;
		}
		System.out.println(p.data);
		while (n!=0) {
			i=0;
			while (i<m-1) {
				p=p.next;
				pre=pre.next;
				i++;
			}
			if (n!=1) {		//刪除p結點
				pre.next=p.next;
				System.out.println(p.data);
				p=null;
				p=pre.next;
				n--;
			}else {			//當n==1(即只有最後一個結點時,p和pre指向同一結點):刪除最後一個結點
				System.out.println(p.data);
				p=null;
				pre=null;
				break;
			}
		}
	}
	public static void main(String[] args) {
		Node h =NodeTool.CreateNodeList("12345");
		Node p =h;
		while (p.next!=null) {
			p=p.next;
		}
		p.next=h.next;
		yuesefuTwo(h, 5, 3, 2);

	}

}