约瑟夫环(java面向对象实现)

  1 /*
  2  * 作者:zhaop
  3  * 功能:约瑟夫环
  4  * 
  5  */
  6 public class Joseph {
  7     public static void main(String[] args) {
  8         // TODO Auto-generated method stub
  9         CyLink link = new CyLink();
 10         link.setLen(5);
 11         link.setK(2);
 12         link.setM(2);
 13         link.createLink();
 14         link.show();
 15         link.play();
 16     }
 17 }
 18 class Child
 19 {
 20     int no;  // 人的编号
 21     Child nextChild = null; // 指向下一个
 22     public Child(int no) 
 23     {
 24         this.no = no;
 25     }
 26 }
 27 class CyLink
 28 {
 29     Child firstChild = null; // 头指针
 30     Child currentChild = null; // 当前指针
 31     int len = 0; // 总人数
 32     int k = 0;   // 从第k个人开始数数
 33     int m = 0;   // 数m个数
 34     public void setLen(int len) 
 35     {
 36         this.len = len;
 37     }
 38     // 设置k
 39     public void setK (int k)
 40     {
 41         this.k = k;
 42     }
 43     public void setM (int m)
 44     {
 45         this.m = m;
 46     }
 47     //初始化环形链表
 48     public void createLink()
 49     {
 50         for (int i = 1; i <= len; i++)
 51         {
 52             Child ch = new Child(i);
 53             if (i == 1)  // 第一个时,修改头指针
 54             {    
 55                 firstChild = currentChild = ch;
 56             }
 57             else
 58             {
 59                 if (i == len) // 最后一人的 下一个指针指向 第一个人
 60                 {
 61                     currentChild.nextChild = ch;
 62                     ch.nextChild = firstChild;
 63                     currentChild = ch;
 64                 }
 65                 else
 66                 {   // 对其他的人来说,让新创建的对象 放在 当前对象的下一个位置,并让当前对象指向新创建的对象
 67                     currentChild.nextChild = ch;
 68                     currentChild = ch;
 69                 }
 70             }    
 71         }
 72     }
 73     //开始游戏
 74     public void play()
 75     {
 76         Child temp = firstChild;
 77         //1.先开始找到数数的人
 78         for (int i = 1; i < k; i++)
 79         {
 80             temp = temp.nextChild;
 81         }
 82         //2.数m下
 83         while (len != 1)  
 84         {
 85             //为了便于修改指针,可以数 m - 1下
 86             for (int i = 1; i < m - 1; i++)
 87             {
 88                 temp = temp.nextChild;
 89             }
 90             
 91             //3.将数到m的小孩弄出圈去
 92             // 此时temp是数m-1后的结果,所以要修改temp的下一个指针的
 93             temp.nextChild = temp.nextChild.nextChild;
 94             temp = temp.nextChild;
 95             len--;
 96         }
 97         System.out.println("最后一个小孩是:" + temp.no);
 98     }
 99     // 打印该环形链表
100     public void show()
101     {
102         Child temp = firstChild;
103         do {
104             System.out.println(temp.no);
105             temp = temp.nextChild;
106         } while (temp != firstChild);
107     }
108 }
View Code

 

posted @ 2017-01-16 15:59  zhaop  阅读(436)  评论(0编辑  收藏  举报