java约瑟夫算法
时间: 2023-07-10 11:11:41 浏览: 97
约瑟夫算法是一个经典的问题,它的具体描述如下:
有n个人围成一圈,从第1个人开始报数,报到m的人出圈,下一个人继续从1开始报数,直到剩下最后一个人。求出最后一个人的编号。
这个问题可以使用循环链表来解决,具体步骤如下:
1. 首先构建一个含有n个节点的循环链表,并将它们连接起来。
2. 从第一个节点开始,依次报数,当报到第m个节点时,将这个节点从链表中删除。
3. 然后从下一个节点开始重新报数,重复以上步骤,直到链表中只剩下一个节点为止。
4. 链表中最后一个节点即为所求。
Java代码如下:
```java
public static int josephus(int n, int m) {
// 构建循环链表
Node head = new Node(1);
Node cur = head;
for (int i = 2; i <= n; i++) {
cur.next = new Node(i);
cur = cur.next;
}
cur.next = head;
// 报数并删除节点
while (cur.next != cur) {
for (int i = 1; i < m; i++) {
cur = cur.next;
}
cur.next = cur.next.next;
}
// 返回最后一个节点的编号
return cur.val;
}
static class Node {
int val;
Node next;
public Node(int val) {
this.val = val;
}
}
```
注意:这里的节点编号从1开始。
阅读全文