约瑟夫环


package com.xy;


public class Demo4 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  CycLink cyclink=new CycLink();
  cyclink.setLen(5);
  cyclink.createLink();
  //从第k个人开始,数m下
  cyclink.setK(2);
  cyclink.setM(2);
  cyclink.show();
  cyclink.play();
 }

}

class Child
{
 int number;
 Child nextChild;
 public Child(int number)
 {
  //给一个编号;
  this.number=number;
 }
}
//环形链表
class CycLink
{
 //先定义一个指向链表第一个小孩的引用
 //指向第一个小孩的引用,不能动
 Child firstChild=null;
 Child temp=null;
 int len=0;//表示共有几个小孩
 int k=0;
 int m=0;
 //设置m
 public void setM(int m)
 {
  this.m=m;
 }
 //设置环形链表的大小
 public void setLen(int len)
 {
  this.len=len;
 }
 
 //设置从第几个人开始数数
 public void setK(int k)
 {
  this.k=k;
 }
 
 //开始play
 public void play()
 {
  Child temp=this.firstChild;
  //1.先找到开始数数的人 
  for(int i=1;i<k;i++)
  {
   temp=temp.nextChild;
  }
  while(this.len!=1)
  {//2.数m下
  for(int j=1;j<m;j++)
  {
   temp=temp.nextChild;
  }
  System.out.println(temp.number);
  //找到要出圈的前一个小孩
  Child temp2=temp;
  while(temp2.nextChild!=temp)
  {
   temp2=temp2.nextChild;
  }
  //3.将数到m的小孩退出圈
  temp2.nextChild = temp.nextChild;
  //让temp指向下一个数数的小孩
  temp=temp.nextChild;
  //this.show();
  this.len--;
  }
  //最后一个小孩
  System.out.println("最后出圈:"+temp.number);
 }
 
 //初始化环形链表
 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.print(temp.number+" ");
   temp=temp.nextChild;
  }while(temp!=this.firstChild);
  
 }
 
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值