约瑟夫杀人算法


/**
* 约瑟夫杀人
* 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();
   }
}

猜你喜欢

转载自www.cnblogs.com/qjweg/p/12678833.html