Java求解约瑟夫环分别采用数组、和链表实现,依次输入每个player的姓名,输出每个player的姓名,序号等信息,并且给出详细代码说明
时间: 2023-03-31 17:03:13 浏览: 116
好的,这是一个关于 Java 的问题,我可以回答。约瑟夫环是一个经典的问题,可以用数组或链表来实现。下面是使用链表实现的 Java 代码示例:
```java
import java.util.Scanner;
public class JosephusLinkedList {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入总人数:");
int n = scanner.nextInt();
System.out.print("请输入报数的大小:");
int m = scanner.nextInt();
// 创建循环链表
Node head = new Node(1);
Node prev = head;
for (int i = 2; i <= n; i++) {
Node node = new Node(i);
prev.next = node;
prev = node;
}
prev.next = head;
// 开始报数
Node p = head;
while (p.next != p) {
// 找到第 m 个节点
for (int i = 1; i < m; i++) {
p = p.next;
}
// 删除该节点
System.out.println("出圈的人是:" + p.data);
p.data = p.next.data;
p.next = p.next.next;
}
System.out.println("最后留下的人是:" + p.data);
}
static class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
}
}
}
```
这段代码使用了链表来实现约瑟夫环,首先创建一个循环链表,然后从头节点开始报数,每次找到第 m 个节点并删除,直到只剩下一个节点为止。在删除节点时,我们可以直接将该节点的值替换为下一个节点的值,然后删除下一个节点即可。
至于输入每个 player 的姓名和输出每个 player 的信息,可以在创建节点时添加一个 name 属性,并在输出时打印出来。这里就不再赘述了。
阅读全文