Josephu问题:
设编号为1,2,3,…n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,他的下一个人又从1开始报数,数到m的那个人又出列,以此类推,直到所有人出列为止,由此产生一个出队列的序列。
解决思路:
由一个不带头结点的循环链表来解决,先构成一个有n个节点的单循环链表,然后由k节点起开始计数,计到m的时候,对应节点从链表中删除,然后再从被删除节点的下一个节点开始从1开始计数,直到最后一个节点从链表中删除,算法结束。
Java代码实现如下:
public class Josephu {
public static void main(String[] args) {
// TODO Auto-generated method stub
//测试构建环形链表及遍历
CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
//创建五个节点
circleSingleLinkedList.addBoy(5);
//遍历打印节点
circleSingleLinkedList.showBoy();
//测试小孩出圈是否正确
//假设从1开始计数,数2次,共5个人
circleSingleLinkedList.countBoy(1, 2, 5);
}
}
//创建一个环形的单向链表
class CircleSingleLinkedList {
//创建一个first节点,当前没有编号
private Boy first = new Boy(-1);
//添加小孩节点,构建成一个环形链表
public void addBoy(int nums) {