约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。 public class Demo4 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub CycLink cyclink =new CycLink(); cyclink.setLen(100); cyclink.creatLink(); cyclink.setK(2); cyclink.setM(2); cyclink.show(); cyclink.play(); } } class Child{ int no; Child nextChileChild=null; public Child(int no){ this.no=no; } } //环形链表 class CycLink{ //先定义一个指向链表第一个小孩的那个引用 //指向第一个小孩的引用,不能动 Child firstChild=null; Child temp=null; int len=0;//表示共有几个小孩 int k; int m; //设置链表大小 public void setLen(int len){ this.len=len; } public void setK(int k){ //设置第几个人开始数数 this.k=k; } public void setM(int m){ //设置m this.m=m; } public void play(){ //1找到开始数数的人 Child temp=this.firstChild; for(int i=1;i<k;i++){ temp=temp.nextChileChild; } //数M下 while(this.len!=1){ for (int j = 1; j < m; j++) { temp=temp.nextChileChild; } Child temp2=temp;//找到要出圈的前一个小孩 while (temp2.nextChileChild!=temp) { temp2=temp2.nextChileChild; } //讲数到M的小孩 退出圈 temp2.nextChileChild=temp.nextChileChild; temp=temp.nextChileChild; System.out.println("现在出圈的是"+temp.no); this.len--; } //打印最优一个小孩 System.out.print("最后出圈的是:"+temp.no); } //初始化链表 public void creatLink(){ for (int i = 1; i <= len; i++) { if (i==1) { //创建第一小孩 Child child=new Child(i); this.firstChild=child; this.temp=child; }else { if (i==len) { Child child =new Child(i); temp.nextChileChild=child; temp=child; temp.nextChileChild=this.firstChild; }else { //继续创建小孩 Child child =new Child(i); temp.nextChileChild=child; temp=child;} } } } public void show(){ Child temChild=this.firstChild; do { System.out.println(temChild.no+"###"); temChild=temChild.nextChileChild; } while (temChild!=this.firstChild); } }