约瑟夫环问题

约瑟夫环问题

约瑟夫环:
1、一群人围在一起坐成环状(如:N)

2、从某个编号开始报数(如:K)

3、数到某个数(如:M)的时候,此人出列,

4、一直循环,直到所有人出列,
解决此问题,通过使用循环链表来解决,需要注意的是,循环过程中不需要头结点的参与,因此在数据添加完成后,应使最后一个结点指向头结点的next结点
即本应是:
在这里插入图片描述
现在是:
头结点  ->   1 ->2->3->4
让头结点不参与循环。才能使得数据正常输出,代码如下:

package List;

public class yuesefu {
    Node root;
    Node rnode;
    public void init_yuesefu(){
        root=new Node();
        root.next=root;
        rnode=new Node();
        rnode.next=root;
    }
    public void yuesefu_add(int n){
      for(int i=1;i<=n;i++) {
          Node node = new Node(i);
          rnode.next.next=node;
          node.next=root;
          rnode.next=node;
      }
      //添加完毕后,将根节点去除循环
      rnode.next.next=root.next;
    }
   
    public void yuesefu_print(int n){
        //pnode指向当前删除结点
        Node pnode=new Node();
        //将pnode初始化为根节点,
        pnode=root;
        int i=1;
        //当向后遍历三个结点的结果是自己时,退出循环,说明此时结点不足三个
        System.out.println("开始删除");
        while(pnode.next!=pnode){
            for(;i<=n-1;i++){
                pnode=pnode.next;

            }i=1;
            System.out.println("此次删除的数据为:"+pnode.next.getData());
            pnode.next=pnode.next.next;
        }


    }
    public static void main(String[] args){
        yuesefu ysf=new yuesefu();
        ysf.init_yuesefu();
        ysf.yuesefu_add(10);
        ysf.yuesefu_print(3);
    }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值