问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。
public class Child {
int no;
Child nextChild = null;
public Child(int no){
this.no = no;
}
}
public class CycLink { Child firstChild = null; int len = 0; Child temp = null; int m = 0; //设置队列长度 public void setLen(int len){ this.len =len; } //设置第几个人出列 public void setM(int m){ this.m = m; } //创建队列,使用循环链表 public void createCyc(){ for(int i=1;i<=len;i++){ Child ch = new Child(i); //第一个人为链表的第一个 if(i==1){ temp = firstChild = ch; } else{ temp.nextChild = ch; temp = ch; //如果是最后一个人就链接到第一个人 if(i==len){ temp.nextChild = firstChild; } } } show(); } public void play(){ //定义两个指针,temp1用来找到第m个人的前一个人,temp2用来找到第m个人 Child temp1 = firstChild; Child temp2 = null; for(int j=len;j>1;j--){ //找到第m个人的前一个人 for(int i=1;i<m-1;i++){ temp1 = temp1.nextChild; } //把第m个人的前一个人链接到第m个人的后一个人 temp2 = temp1.nextChild; temp1.nextChild = temp2.nextChild; temp1 = temp2.nextChild; } System.out.println("结果是:" + temp1.no); } public void show(){ Child temp3 = this.firstChild; do{ System.out.print(temp3.no + " "); temp3 = temp3.nextChild; } while(temp3 != this.firstChild); } }
public class Josefu { public static void main(String[] args) { // TODO Auto-generated method stub CycLink cyc = new CycLink(); cyc.setLen(10); cyc.createCyc(); cyc.setM(4); cyc.play(); } }