约瑟夫问题,有n个人,从第k个开始报数,数到第m个,则该人出列,直到最后一个人为止,看这n个人出列的顺序。
1.定义一个helper结点,循环将helper指向first的后面一个结点;
2.先将指针,指到k的位置;
3.循环报数,当到达m时,跳出for循环,然后当前结点出列;
@paramn 结点个数
@paramk 第k个开始报数
@paramm 第m个为止,且出列。
public void josephu(int n,int k, int m) {
// 参数判断
if (n <= 0 || k > n || m < 0) {
System.out.printf("参数输入错误");
}
// 定义临时指针
Boy helper;
Boy temp1 = first;
// 循环将helper指向first的后面一个结点
while (true) {
if (temp1.getNext() == first) {
break;
}
temp1 = temp1.getNext();
}
helper = temp1;
// 先将指针,指到k的位置
for (int i = 1; i <= k; i++) {
first = first.getNext();
helper = helper.getNext();
}
System.out.println();
// 循环报数,当到达m时,跳出for循环,然后当前结点出列
while(true) {
if (helper == first) {
System.out.printf("最后出列的是:%d\r\n", first.getOn());
break;
}
for (int i = 1; i <= m; i++) {
first = first.getNext();
helper = helper.getNext();
}
System.out.printf("当前出列的是:%d\r\n", first.getOn());
first = first.getNext();
helper.setNext(first);
}
}版权声明:本文为weixin_51730356原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。