约瑟夫问题,单向循环链表

我也是最近才开始重新学,不要问为什么,只是因为之前学的不咋地,如有误,请指出。

首先创建一个循环链表,使用first指向开始的数据,helper指向最后一个数据,通过循环的方式逐渐输出数据,并把输出后的数据从链表中移除。看代码

class Boy {
    private int no;//编号
    private Boy next;//指向下一个节点

    public Boy(int no) {
        this.no = no;
    }

    public int getNo() {
        return no;
    }

    public Boy getNext() {
        return next;
    }

    public void setNext(Boy next) {
        this.next = next;
    }
}
/**
 * @param startNo  表示从第几个数据开始
 * @param countNum 表示数几下
 * @param nums     表示最初有几个数据
 */
public void countBoy(int startNo, int countNum, int nums) {
    //先对数据进行校验
    if (first == null || startNo < 1 || startNo > nums) {
        System.out.println("数据有误");
        return;
    }
    //创建辅助指针
    Boy helper = first;
    //使helper指向最后一个数据
    while (helper.getNext() != first) {
        helper = helper.getNext();
    }
    //先把first移动到startNo位置
    //自己算第一个所以移动startNo-1次
    for (int i = 0; i < startNo - 1; i++) {
        first = first.getNext();
        helper = helper.getNext();
    }
    //出数据
    while (first != helper) {
        //数数出圈
        for (int i = 0; i < countNum - 1; i++) {
            first = first.getNext();
            helper = helper.getNext();
        }

        System.out.println(first.getNo());
        first = first.getNext();
        helper.setNext(first);//删除输出后的数据
    }
    System.out.println(first.getNo());//输出最后一个数据
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值