约瑟夫环形列java实现

//约瑟夫环形表 

public class Josepfu {

public static void main(String[] args) {

// TODO Auto-generated method stub

JosepfuDemo demo = new JosepfuDemo();

demo.addBoy(5);

demo.Iteroter();

demo.out(1, 2, 5);

}

}

class JosepfuDemo {

private Boy first = null;

// 传入孩子数量

public void addBoy(int nums) {

Boy boyTemp = new Boy(0);

if (nums < 1) {

System.out.println("孩子数量异常");

}

for (int i = 1; i <= nums; i++) {

Boy boy = new Boy(i);

// 构造第一个节点

if (i == 1) {

first = boy;

first.setNext(boy);

boyTemp = boy;

} else {

boyTemp.setNext(boy);

boy.setNext(first);

boyTemp = boy;

}

}

}

public void Iteroter() {

if (first == null) {

System.out.println("链表为空");

return;

}

Boy tempBoy = first;

// 遍历约瑟夫链表

while (true) {

System.out.println(tempBoy.getNo());

if (tempBoy.getNext() == first) {

break;

}

// 后移

tempBoy = tempBoy.getNext();

}

}

// 孩子们开始出圈

// k is The first k personal

// m 是数几下

public void out(int k, int m, int nums) {

if (k < 0 || m < 1 || nums < 1) {

System.out.println("输入不正确");

return;

}

// 先创建一个辅助节点helper位于first的前面一位

Boy helperBoy = first;

while (true) {

if (helperBoy.getNext() == first) {

break;

}

helperBoy = helperBoy.getNext();

}

// 同时将first helper 移动到K的位置 即需要移动k-1次

for (int i = 0; i < k - 1; i++) {

first = first.getNext();

helperBoy = helperBoy.getNext();

}

while (true) {

// 这个时候圈里只剩下一个人

if (helperBoy == first) {

break;

}

// 进行出圈操作 需要移动m-1次

for (int j = 0; j < m - 1; j++) {

first = first.getNext();

helperBoy = helperBoy.getNext();

}

// 这时候 first就是出圈的人

System.out.println("出圈" + first.getNo());

first = first.getNext();

helperBoy.setNext(first);

}

System.out.println("出圈" + helperBoy.getNo());

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值