下面是用面向对象和链表实现的Java代码:

public class JosephusCircle {
    private Node head;
    private int size;

    public JosephusCircle(int n) {
        if (n <= 0) {
            throw new IllegalArgumentException("n must be a positive number");
        }

        // 创建循环链表
        head = new Node(1);
        Node current = head;
        for (int i = 2; i <= n; i++) {
            current.next = new Node(i);
            current = current.next;
        }
        current.next = head;
        size = n;
    }

    public int eliminate(int m) {
        if (m <= 0) {
            throw new IllegalArgumentException("m must be a positive number");
        }

        Node prev = head;
        while (prev.next != head) {
            // 找到要删除的节点
            for (int i = 1; i < m - 1; i++) {
                prev = prev.next;
            }
            // 删除节点
            Node current = prev.next;
            prev.next = current.next;
            current.next = null;
            size--;
            prev = prev.next;
        }
        return head.data;
    }

    private class Node {
        private int data;
        private Node next;

        public Node(int data) {
            this.data = data;
        }
    }

    public static void main(String[] args) {
        int n = 7;
        int m = 3;
        JosephusCircle circle = new JosephusCircle(n);
        int lastRemaining = circle.eliminate(m);
        System.out.println('The last remaining person is: ' + lastRemaining);
    }
}

这段代码中,JosephusCircle类表示约瑟夫环,其中的Node类表示链表节点。在构造函数中,我们创建了一个循环链表,并设置了初始大小。eliminate方法用于实现约瑟夫环的淘汰过程,接受一个参数m,表示每次淘汰的间隔。在eliminate方法中,我们使用两个指针prevcurrent来遍历链表,找到需要删除的节点,并进行删除操作。最后,我们返回剩下的最后一个人的编号。

main方法中,我们创建了一个约瑟夫环对象,并调用eliminate方法来求解问题。最后,输出剩下的最后一个人的编号。


原文地址: https://www.cveoy.top/t/topic/picU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录