面對物件的出圈問題
阿新 • • 發佈:2018-11-21
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); }
}