/**
* 约瑟夫杀人
* n个人首位相连,依次从1数到5,数到5(m)就杀一个人,最后剩下谁
* @author xueci
*
*/
public class TestJosephus {
int n=20;
int m=5;
class People{
int index;
People next;
public People(int index) {
super();
this.index = index;
}
}
void killPeople(){
//首先new出第一个人
People pFirst=new People(1);
//两个不同的引用指向同一个people对象(1,null)
//作用1为了给当前引用指向初始对象,后面要频繁的指向别的对象 2一个新的引用表示当前数数的人
People currentP=pFirst;
//首先new n个人,并且构造n个人的数据结构,单向循环链表
for (int i = 2; i <= n; i++) {
//new 出第i个人,第一次遍历:currentP.next地址指向新new people(i),即pFirst.next指向new people(i)因为pFirst,currentP刚开始地址一样
//第二次遍历 currentP指向第二人堆内存, currentP.next指向第3人 堆内存; ……
currentP.next=new People(i);
//当前数到的人currentP地址指向第i人堆内存
currentP=currentP.next;
}
//currentP此时是指向第20个人得堆内存,next指向第一个人得堆内存空间,即单像链表循环起来了
currentP.next= pFirst;
while(currentP.next!=currentP){
for(int j=1;j<m;j++){
currentP=currentP.next;
}
System.out.println("第"+currentP.next.index+"被杀");
//5 被杀 4 接6 类似的
currentP.next=currentP.next.next;
}
System.out.println("最终活下来的是"+currentP.index);
}
public static void main(String[] args){
TestJosephus josephus = new TestJosephus();
josephus.killPeople();
}
}