1.Josephu question:

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



2.思路

1.构成一个有n个节点的单循环链表
2.从第k个节点开始报数(k是第一个),当报的数等于m时停止,将该节点删除
3.从上一个删除节点的下一个节点继续报数,直到所有节点删除


3.代码实现方式1

package com.company;

/**
 * @author:抱着鱼睡觉的喵喵
 * @date:2021/2/11
 * @description:
 */
public class JosephDemo3 {
    public static void main(String[] args) {
        System.out.println("出列的顺序为:");
        new CircleSingleLinkedList().Joseph(2, 10, 5);
    }
}

class CircleSingleLinkedList {
    private CircleNodes front;	//指向循环链表的第一个节点,始终保持不变
	/**
	 *构建一个循环链表
	 *@param nums 循环链表长度
	 */
    public void add(int nums) {
        if (nums < 1) {
            System.out.println("LinkedList is empty!");
            return;
        }
        CircleNodes cur = null;
        for (int i = 1; i <= nums; i++) {
            CircleNodes circleNodes = new CircleNodes(i);
            if (i == 1) {
                front = circleNodes;
                front.setNext(circleNodes);
                cur = circleNodes;
            } else {
                cur.setNext(circleNodes);
                circleNodes.setNext(front);
                cur = circleNodes;
            }
        }
    }


    /**
     *核心函数
     * @param k 从第几个位置开始
     * @param m 数几个数
     * @param n 环形队列的长度
     */
    public void Joseph(int k, int m, int n) {
        if (n < 1 || k < 1 || m < 1) {
            System.out.println("n或k或m不符合规则!");
            return;
        }
        add(n);		//创建一个长度为n的循环链表
        CircleNodes cur = front;
        CircleNodes temp = front;
        while (cur.getNext() != front) {       //将
            cur = cur.getNext();
        }
        for (int s = 1; s < k; s++) {
            cur = cur.getNext();
            temp = temp.getNext();
        }
        int nums = n;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < ((m - 1) % nums); j++) {
                cur = cur.getNext();
                temp = temp.getNext();
            }
            nums--;
            System.out.printf("%d->",temp.getSno());
            temp = temp.getNext();
            cur.setNext(temp);
        }
    }
}
//节点类
class CircleNodes {
    private int sno;
    private CircleNodes next;

    public CircleNodes getNext() {
        return next;
    }

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

    public CircleNodes(int sno) {
        this.sno = sno;
    }

    public int getSno() {
        return sno;
    }

    public void setSno(int sno) {
        this.sno = sno;
    }
}

4.代码实现方式2

package com.company;

/**
 * @author:抱着鱼睡觉的喵喵
 * @date:2021/2/11
 * @description:
 */
public class JosephDemo2 {
    public static void main(String[] args) {
        CircleNode2 circleNode = new CircleNode2(1);
        CircleNode2 circleNode2 = new CircleNode2(2);
        CircleNode2 circleNode3 = new CircleNode2(3);
        CircleNode2 circleNode4 = new CircleNode2(4);

        CircleLinkedList2 circleLinkedList2 = new CircleLinkedList2();
        circleLinkedList2.add(circleNode);
        circleLinkedList2.add(circleNode2);
        circleLinkedList2.add(circleNode3);
        circleLinkedList2.add(circleNode4);
     
        Joseph(1, 1, circleLinkedList2);
   
    }

    public static void Joseph(int k, int m, CircleLinkedList2 circleLinkedList2) {
        int length = circleLinkedList2.getLength();
        if (k <= 0 || m <= 0 || length <= 0) {
            System.out.println("k或m或链表长度不符合条件:(k>0 && m>0 && length>0)!");
            return;
        }
        CircleNode2 head = circleLinkedList2.front;
        int nums = 0;
        CircleNode2 cur = circleLinkedList2.front;
        while (nums != k - 1) {
            nums++;
            cur = cur.next;
        }
        CircleNode2 pNode = circleLinkedList2.front;
        for (int j = 0; j < k - 2; j++) {
            pNode = pNode.next;
        }
        for (int i = 0; i < length; i++) {
            nums = 0;
            while (nums != m - 1) {
                nums++;
                pNode = pNode.next;
                cur = cur.next;
            }
            System.out.printf("%d->", cur.sno);
            pNode.next = cur.next;
            cur = cur.next;
        }
    }
}

class CircleNode2 {
    public int sno;
    public CircleNode2 next;

    public CircleNode2(int sno) {
        this.sno = sno;
    }
}

class CircleLinkedList2 {

    CircleNode2 front;
    CircleNode2 cur;

    public void add(CircleNode2 node) {
        if (front == null) {
            front = node;
            node.next = node;
            cur = node;
        } else {
            cur.next = node;
            node.next = front;
            cur = node;
        }
    }

    public void list() {
        if (front == null) {
            System.out.println("LinkedList is empty!");
            return;
        }
        System.out.println(front);
        CircleNode2 temp = front.next;
        while (temp != front) {
            System.out.println(temp);
            temp = temp.next;
        }
    }

    public int getLength() {
        int nums = 0;
        if (front == null) {
            return nums;
        }
        nums++;
        CircleNode2 temp = front;
        while (temp.next != front) {
            nums++;
            temp = temp.next;
        }
        return nums;
    }

}

此代码仅为个人见解,还需更改

posted on 2021-02-11 22:41  凸凸大军的一员  阅读(66)  评论(0编辑  收藏  举报