//有500个人坐成一圈从第一个开始报数为3时出列 再从1开始遇到3出列 依次下去 直到圈里只有一个人时 求它原来在内圈的位置


//方法一:用面向对象
public class ExampleArray    //测试类
{
    public static void main(String [] args)
    {
Kidcircle kc=new Kidcircle(500);    //创建Kidcircle类的对象 kc
int countNum = 0;
Kid k=kc.first;      //对象.属性  
while(kc.count>1)    //当圈内多与一个人时记数
{
   countNum++;        //计数器自加
   if(countNum==3)    //当记数为3时
   {
      countNum=0;     //记数器归零
      kc.delete(k);   //删除该接点
   }
   //指向下一个小孩
   k=k.right;
}
System.out.println(kc.first.id);
    }
}
class Kid         //人类
{
    int id;     //编号
    Kid left;   //左
    Kid right;  //右
}
class Kidcircle   //圈类
{
    int count=0;  //总数
    Kid first;    //第一个
    Kid last;     //最后一个
    Kidcircle(int n)   //构造方法
    {
      for(int i=0;i<n;i++)
      {
add();        //调用 add() 方法
      }
    }
    void add()        // add() 方法添加人
    {
Kid k=new Kid();  //创建 Kid类的 对象 k
  k.id = count;     //对象.属性
if(count<=0)   //当圈内没有人时
  {
    first = k;  //进去一个人后 他是第一个也是最后一个左边和右边都是他本身
    last = k;
    k.left = k;
    k.right = k;
     }
else         //当圈内多与两个人时
   {
    last.right = k;
    k.left = last;
    k.right = first;
    first.left = k;
    last = k;
  }
count++;     //增加1
    }

    void delete(Kid k)   // delete() 方法 删除人
    {
if(count<=0)  //当没有人时
{
   return ;
}
else if(count==1)     //当有一个人时
{
   first=null;    //它既是第一个也是最后一个
   last=null;
}
else          //当多与两个人时
{
   k.left.right = k.right;
   k.right.left = k.left;
          if(k==first)     //当删除第一个时
   {
      first = k.right;
   }
    else if(k==last) //当删除最后一个时
   {
      last = k.left;
   }
}
count--;   //总人数减1
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值