描述
N 个人围成一圈顺序编号,从1 号开始按1、2、3 顺序报数,报3 者退出圈外,其余的人再从1、2、3 开始报数,报3 的人再退出圈外,依次类推。请按退出顺序输出每个退出人的原序号。要求使用环行链表编程。
输入描述:
输入第一行为整数m表示有m组测试数据,接下来m行每行一个整数N,N不超过50。
输出描述:
输出m行,每行表示题目所求,用空格隔开。
示例1
输入:
1 4
输出:
3 2 4 1
代码如下:
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
/*
* 围圈报数
*/
public class RingTheCount {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int m = scanner.nextInt();
for (int i = 0; i < m; i++) {
int n = scanner.nextInt();
//按照输入顺序排序
List<Integer> myList = new LinkedList<Integer>();
for (int j = 1; j <= n; j++) {
myList.add(j);
}
while(!myList.isEmpty()) {
if(myList.size() >= 3) {
System.out.print(myList.get(2)+" ");
reSortList(myList);
continue;
}else {
System.out.print(myList.remove(0)+" ");
}
}
//换行输出
System.out.println();
}
}
}
public static void reSortList(List<Integer> myList) {
//重排List:实现将List的前两个元素插入到最后得到一个新的List
if (myList.size() >= 3) {
int list1 = myList.remove(0);
int list2 = myList.remove(0);
//删除原来List中第3个元素
myList.remove(0);
myList.add(list1);
myList.add(list2);
}
}
}