约瑟夫问题c++,循环链表
时间: 2023-08-04 07:15:10 浏览: 97
好的,我来为您提供约瑟夫问题的C++代码,使用循环链表实现:
```c++
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
Node* createCircle(int n) {
Node* head = new Node();
head->data = 1;
head->next = nullptr;
Node* p = head;
for (int i = 2; i <= n; i++) {
Node* q = new Node();
q->data = i;
q->next = nullptr;
p->next = q;
p = q;
}
p->next = head;
return head;
}
void josephusProblem(Node* head, int k) {
Node* p = head;
while (p->next != p) {
for (int i = 1; i < k - 1; i++) {
p = p->next;
}
Node* q = p->next;
p->next = q->next;
cout << q->data << " ";
delete q;
p = p->next;
}
cout << p->data << endl;
delete p;
}
int main() {
int n = 5; // 总人数
int k = 3; // 报数为3的出列
Node* head = createCircle(n);
josephusProblem(head, k);
return 0;
}
```
以上代码中,首先我们创建一个循环链表,然后从头节点开始遍历链表,每次遍历到第k-1个节点,删除第k个节点,直到链表中只剩下一个节点为止。最后输出这个节点的值,即为最后一个出列的人的编号。
希望能够帮到您!
阅读全文