使用c++链表的方式实现约瑟夫环
时间: 2023-08-02 20:09:10 浏览: 99
C++循环链表之约瑟夫环的实现方法
好的,下面是使用C++链表实现约瑟夫环的代码:
```c++
#include <iostream>
using namespace std;
struct Node {
int data;
Node *next;
};
Node* createList(int n) {
Node *head = new Node{1, nullptr};
Node *tail = head;
for (int i = 2; i <= n; i++) {
Node *node = new Node{i, nullptr};
tail->next = node;
tail = node;
}
tail->next = head; // 将尾结点指向头结点,形成一个环
return head;
}
void josephus(int n, int m) {
Node *head = createList(n);
Node *tail = head;
while (tail->next != head) {
tail = tail->next;
}
Node *p = head;
while (p->next != p) {
for (int i = 1; i < m; i++) {
tail = p;
p = p->next;
}
tail->next = p->next;
cout << p->data << " ";
delete p;
p = tail->next;
}
cout << p->data << endl;
delete p;
}
int main() {
int n = 5; // 总人数
int m = 3; // 报数为 m 的人出圈
josephus(n, m);
return 0;
}
```
代码的思路是先创建一个包含1~n的环形链表,然后使用循环遍历链表,每次遍历m个结点,将第m个结点删除,并输出该结点的值。最后只剩下一个结点,输出该结点的值即可。
阅读全文