1. 程式人生 > >面對物件的出圈問題

面對物件的出圈問題

Person

public class Person {

int id;  //人的編號
Person left;   //人的右邊
Person right;  //人的左邊

}

主類 出圈

public class Circle {

int times;   //次數
int count =  0;   // 統計的總人數
Person first;  //圈中第一人
Person last;	//圈中最後一個
static int idNum = 0;  //設定一個動態的變數來給每一個人賦值
static int x = 0;
//建構函式 我們建立一個圈
Circle(int n)
{
	x = n;
	//建立n個人物
	for(int i = 0; i < n; i ++)
	{
		//首先建立一個臨時的人物
		Person temp = new Person();
		//每一個人都給一個id   從 1 ,2,3,...
		temp.id = ++idNum;
		//都新增一個人物進去
		add(temp);
		//總人數++
		count++;
	}
	System.out.println("-------人物新增完成-------");
	System.out.println();
}


//圈中新增人    
void add(Person p)
{
	/*
	 * 如果圈中沒人 
	 */
	if(count == 0)
	{
		//第一個人和最後一個人都是本身
		first = p;
		last = p;
		//且 它左右邊沒人  即為空
		p.left = null;
		p.right = null;
		System.out.println("--------當前圈中無人--------");
		System.out.println("第一個人是 "+first.id+" 最後一個人是"+ last.id);
		System.out.println();
		System.out.println("新增成功 當前人物id為: "+p.id);
		System.out.println();
		System.out.println("--------當前圈中有人--------");
	
	}
	/*
	 * 如果圈中有人  人數至少為1
	 */
	if(count > 0)
	{
		//如果這是最後一個人的話
		if(p.id  == x )
		{
			//首先進來的人先牽住最後一個人
			p.left = last;
			//最後一個人的右手牽住當前人
			last.right = p;
			last = p;
			//它的右邊為圈的起始第一人
			p.right = first;
			//第一個人牽住最後一個人的手
			first.left = p;
		}
		else
		{
		//首先進來的人先牽住最後一個人
		p.left = last;
		//最後一個人的右手牽住當前人
		last.right = p;
		//新增成功之後
	    last = p;
		}
			System.out.println("新增成功 當前人物id為: "+p.id);
	}
}

//刪除圈中的當前的人
void del(Person p)
{
	//它的 左邊的人的右邊人 = 它的右邊
	p.left.right = p.right;
	//它的 右邊的人的左邊人 = 它的左邊
	p.right.left = p.left;
	
	//如果刪除的時候  刪除的正好是first 或者last的話
	if( p == first)
	{
		first = p.right;
	}
	else if( p == last)
	{
		last = p.left;
	}
	//提示出圈人的id資訊
	System.out.println(" 出圈的人是:"+p.id+"\n");
}

//報道m的人出圈
public void result(int m)
{
	
	System.out.println("-------報數出圈-------");
	int num = 0;
	Person p = first;
	
	//這是去測驗退出的人物
	int times = 0;   
	
	while(times < x - 1)
	{
		/*
		 * 在 一圈的人當中
		 * 退出的條件就是  p 是 最後一個人
		 */
		for(;p != last;p = p.right)
		{
			
			if(num ==  m - 1)
			{
				System.out.print("第"+(times+1)+"個");
				del(p);
				num = 0;
				times++;
			}
			else num++;
		}
		// ------------
		if(p == last)
		{
			
			//而且for迴圈過後  p是正好報數的人
			if(num==m-1)
			{
				System.out.print("第"+(times+1)+"個");
				//刪除這個人
				del(p);
				//刪除了這個人後 向右邊移動一個
				p = p.right;
				//重新報數
				num = 0;
				//人物減少
				times++;
			}
			/*
			 * 如果P是最後一個人 但不是要報數的人 
			 * 我們就把P移動
			 */
			else
			{
			num++;
			p = p.right;
			}
		}
		else   //如果這個人物是最後一個 但是不符合條件的話
		{
			num++;
			p = p.right;
		}
		 

	}
	System.out.println("最後一個出圈的人是:"+last.id);
}

public static void main(String[] args) {
	//首先我們建立一個圈  裡面有8個人
	//建構函式裡面已經添加了人
	// 6個人  顯示  364251
	// 7個人  顯示  3627514
	// 8個人 顯示 36152847
	Circle c = new Circle(8);  
	c.result(3);
}

}