問題描述:N個人圍成一圈,從第一個人開始報數,報到m的人出圈,剩下的人繼續從1開始報數,報到m的人出圈;如此往復,直到所有人出圈。(模擬此過程,輸出出圈的人的序號)
定義Person類(單鏈表節點)
public class Person {
public int id;
public Person next;
public Person(int id) {
this.id = id;
}
}
定義CircleSingleLinkedList類(循環鏈表以及其出圈方法)
public class CircleSingleLinkedList {
public Person head;
public CircleSingleLinkedList() {
}
/**
* 添加孩子節點,侯建一個環形的鏈表
* @param nums
*/
public void addBoy(int nums){
if(nums < 0){
System.out.println("輸入人數有誤!");
return;
}
Person cur = head;
for(int i = 1;i <= nums;i++){
Person node = new Person(i);
if(i == 1){
head = node;
node.next = head;
}else{
cur.next = node;
node.next = head;
}
cur = node;
}
}
/**
* 遍歷當前的環形鏈表
*/
public void showBoy(){
if(head == null){
System.out.println("當前圈圈沒有人");
return ;
}
Person cur = head;
while (true){
System.out.println("小孩的編號"+cur.id);
if(cur.next == head){
break;
}
cur = cur.next;
}
}
//根據用戶輸入,計算出小孩出圈的順序
/**
*
* @param startNum 表示從第幾個小孩開始數數
* @param countNum 表示數幾下
* @param nums 表示最初有多少小孩在圈中
*/
public void countBoy(int startNum,int countNum,int nums){
if(head == null || startNum < 1 || startNum > nums){
System.out.println("參數輸入有誤,請重新輸入!");
return;
}
Person cur = head;
while(startNum -1 >0){
cur = cur.next;
startNum--;
}
Person prev = cur;
while(true){
if(prev.next == cur){
break;
}
prev = prev.next;
}
while(true){
if(prev == cur){
break;
}
int count = countNum;
while(count-1 > 0){
prev = prev.next;
cur = cur.next;
count--;
}
System.out.println(cur.id);
cur = cur.next;
prev.next = cur;
}
System.out.println(cur.id);
}
}
測試類:
public class TestCSLL {
public static void main(String[] args) {
CircleSingleLinkedList circle = new CircleSingleLinkedList();
circle.addBoy(5);
circle.showBoy();
circle.countBoy(1,2,5);
}
}
運行結果: