Joseph环问题-单向环形列表

环节点类

public class Littlechild {
      public  Littlechild next;
      public  int number;
      public Littlechild(int i)
      {
          number=i;
      }

    @Override
    public String toString() {
        return "Littlechild{" +
                "number=" + number +
                '}';
    }
}

链表的实现类

public class CircleLinkedList {
   private Littlechild first;
   public static int count;
   public CircleLinkedList()
   {
       first=new Littlechild(-1);
   }
   public void showChild()
   {
       Littlechild temp=first;
       if (temp.next==null)
       {
           return;  //有结束函数的作用,即使返回类型是void时
       }
       while (temp.next!=first)
       {
           System.out.println(temp);
           temp=temp.next;
       }
       System.out.println(temp);
   }
   public void AddNums(int n) {
       //自创方法         先当直链看待,到末节点时再和首节点相连
//       Littlechild child=null;
//       for (int i = 1; i <n ; i++) {
//              if (i==1)
//              {
//                 first =new Littlechild(i);
//                  child=first;
//              }
//           child.next=new Littlechild(i);
//           child=child.next;
//       }
//       child.next=first;
//   }
       //教习方法
       count=n;
       Littlechild Curchild = null;
       for (int i =1; i < n+1; i++) {    //i的变化从1开始,否则实际的第一个节点num是0
             Littlechild child=new Littlechild(i);
             if (i == 1) {
               first = child;
               first.next = first;
               Curchild = first;
           }else {                         //从始至终都当做环来看待
                 Curchild.next =child;
                 child.next=first;
                 Curchild=child;

             }
       }

   }
   public void outofCir(int start,int cross,int count)
   {
        if (start<0||start>count||cross>count||first.next==null)
        {
            System.out.println("不符合游戏规则");
            return;
        }
        Littlechild helper = null;
        Littlechild temp=first;
       while (temp.number!=start)
           {
               temp=temp.next;     //这里不必需要helper跟在temp后,因为当temp开始向下移一次时,helper必然就占据temp的初始位置
           }

       while (count!=1)   //结束循环的条件 还可以是temp==helper 代表只存在一个节点
       {
           for (int i = 1; i <cross ; i++) {
               helper=temp;                       //和上呼应,解释为甚么helper不必一开始就跟着temp
               temp=temp.next;
           }
           System.out.println("小孩"+temp.number+"出圈");
           helper.next=temp.next;
           temp=temp.next;
           count--;
       }
       System.out.println("最后一个小孩"+temp.number+"出圈");

   }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值