环形链表,Josephu 问题(java实现)

Josephu    问题

      Josephu  问题为:设编号为 1,2,…  n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

环形链表,Josephu 问题(java实现)_第1张图片

环形链表,Josephu 问题(java实现)_第2张图片

环形链表,Josephu 问题(java实现)_第3张图片

 

 

创建一个孩子对象

/**
 * 定义一个小孩儿对象
 */
class Boy{
    private int no;
    private Boy next;

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

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public Boy getNext() {
        return next;
    }

    public void setNext(Boy next) {
        this.next = next;
    }
}

 

创建一个循环链表操作对象,有创建环形链表,遍历环形链表,孩子出圈

/**
 * 单向循环链表的操作对象
 */
class CircleSingleLinkedList{
    Boy first = null;
    /**
     * 小孩儿出圈
     * @param k 从第k个小孩儿开始数
     * @param count 数count下出一个小孩儿
     * @param nums 小孩儿的个数
     */
    public void countBoy(int k,int count,int nums){
        if(first == null || k < 1 || k > nums){
            System.out.println("参数有误,请重新输入...");
            return ;
        }
        Boy helper = first;
        // 1.使helper指针指向最后一个节点
        while(true){
            if(helper.getNext() == first){
                break;
            }
            helper = helper.getNext();
        }
        // 2.从第k个小孩儿开始数,所以重置first和helper的位置
        for(int j=0;j

测试

/**
 * @author AN
 * @create 2020-08-27 12:17
 */
public class Josephu {
    public static void main(String[] args) {
        CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
        circleSingleLinkedList.addBoys(5);
        circleSingleLinkedList.showBoy();
        circleSingleLinkedList.countBoy(1,2,5);
    }
}

测试结果

环形链表,Josephu 问题(java实现)_第4张图片

你可能感兴趣的:(数据结构)