/**
  * 丢手绢问题
  */
 package practice1;
public class lianxi {
    /**
      * @param args
      */
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         CycLink cyclink=new CycLink();
         cyclink.setlen(5);
         cyclink.createLink();
         cyclink.setK(2);
         cyclink.setM(2);
         cyclink.show();
         cyclink.play();
     }
}
 //定义链表结点
 class Child
 {
     int no;//结点坐标
     Child nextChild=null;//初始化下节点为空
     public Child(int no)//构造一个结点
     {
         this.no=no;
     }
 }
 //定义一个链表
 class CycLink
 { 
     //先定义一个指向链表第一个小孩的引用
     //指向第一个小孩的引用 ,不能动
     Child firstChild=null;
     Child temp=null;
     int len=0;//表示共有几个小孩
     int k=0;
     int m=0;
     //设置链表的大小
     public void setlen(int len)
     {
         this.len=len;
         
     }
     //设置从第几个人开始数数
     public void setK(int k)
     {
         this.k=k;
     }
     public void setM(int m)
     {
         this.m=m;
     }
     
     //开始play
     public void play()
     {
         Child temp=this.firstChild;
         //先找到开始数数的人
         for(int i=1;i<k;i++)
         {
             temp=temp.nextChild;
         }
         while(this.len!=1){
         //数m下
         for(int j=1;j<m;j++)
         {
             temp=temp.nextChild; 
         }
         //找到要出圈的前一个小孩
         Child temp2=temp;
         while(temp2.nextChild!=temp)
         {
             temp2=temp2.nextChild; 
         }
         //将数到m的小孩,退出圈
         temp2.nextChild=temp.nextChild;
         //让temp指向下一个数数的小孩
         temp=temp.nextChild;
 //        this.show();
         this.len--;
         }
         //最后小孩
         System.out.println(temp.no);
     }
     //初始化一个环形链表
     public void createLink()
     {
         for(int i=1;i<=len;i++)
         {
             if(i==1){
             //创建第一个小孩
             Child ch=new Child(i);
             this.firstChild=ch;
             this.temp=ch;
             }else
             {
                 if(i==len)
                 {
                     Child ch=new Child(i);
                     temp.nextChild=ch;
                     temp=ch;
                     temp.nextChild=this.firstChild;
                 }else{
                 //继续创建小孩
                 Child ch=new Child(i);
                 temp.nextChild=ch;
                 temp=ch;
                 }
             }
             
             
         }
     }
     
//打印环形链表
     public void show()
     {
     //定义一个跑龙套
         Child temp=this.firstChild;
         do{
         System.out.println(temp.no);
         temp=temp.nextChild;
         }while(temp!=this.firstChild);
     }    
 }

京公网安备 11010502036488号