Java 约瑟夫环问题:面向对象和链表实现
下面是用面向对象和链表实现的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方法中,我们使用两个指针prev和current来遍历链表,找到需要删除的节点,并进行删除操作。最后,我们返回剩下的最后一个人的编号。
在main方法中,我们创建了一个约瑟夫环对象,并调用eliminate方法来求解问题。最后,输出剩下的最后一个人的编号。
原文地址: https://www.cveoy.top/t/topic/picU 著作权归作者所有。请勿转载和采集!