问题描述:
Josephu 问题:
设编号为 1,2,…… n 的n个人未作一圈,约定编号为 k (1<=k<=n)的人从1 1开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,疏导 m 的那个人出列。依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
思路分析:
可以使用单向环形链表来解决该类题目:
例如:当 n = 5, k = 1,m = 2,时
它的出列顺序依次是 2 -> 4 -> 1 -> 5 -> 3;
- 第一步:先创建一个节点类,将单向环形链表的各个节点用类来封装,因为每个节点都包括 序号、next,因此就可以直接从某个特定的类表示,每次添加链表时,创建这个对象即可;
- 第二步:创建一个单向环形链表类,里边包括 创建链表的方法、出链表的方法;
- 第三步:主函数运行即可。
代码实现:
节点类
class BoyNode{
private int no;
private BoyNode next;
public BoyNode(int no){
this.no = no;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public BoyNode getNext() {
return next;
}
public void setNext(BoyNode next) {
this.next = next;
}
}
链表类
class CircleSingleLinkedList{
// 环形链表的第一个节点
private BoyNode first = null;
// 给定一个值 n 创建 大小为 n 的环形链表
public void makeLinkedList(