约瑟夫问题c++语言链表
时间: 2025-01-13 15:51:26 浏览: 49
### 使用 C++ 链表实现约瑟夫问题
约瑟夫问题是经典的算法问题之一,涉及循环链表的应用。下面展示了一个完整的解决方案来解决这个问题。
```cpp
#include <iostream>
using namespace std;
struct Node {
int data;
Node *next;
};
// 创建具有n个节点的环形链表
Node* createCircularLinkedList(int n) {
if (n <= 0) return nullptr;
Node *head = new Node{1, nullptr};
Node *current = head;
for (int i = 2; i <= n; ++i) {
current->next = new Node{i, nullptr};
current = current->next;
}
current->next = head; // 形成闭环
return head;
}
void josephusProblem(Node *&head, int m) {
Node *prev = nullptr;
Node *curr = head;
while (curr->next != curr) { // 当只剩下一个节点时结束
for (int i = 1; i < m; ++i) {
prev = curr;
curr = curr->next;
}
cout << "淘汰:" << curr->data << endl;
prev->next = curr->next; // 移除当前节点
delete curr;
curr = prev->next;
}
cout << "最后剩下的人编号为:" << curr->data << endl;
delete curr;
}
int main() {
int n, m;
cin >> n >> m;
Node *circleListHead = createCircularLinkedList(n);
josephusProblem(circleListHead, m);
return 0;
}
```
上述程序首先创建一个包含`n`个人员编号(从1到n)组成的环形链表[^1]。接着,在`josephusProblem`函数内部实现了模拟报数过程并按照指定间隔`m`逐步移除被淘汰者直到只剩下最后一个幸存者的逻辑[^4]。
阅读全文
相关推荐


















