代码生成c++链表实现约瑟夫问题,可以用户自定义输入数据
时间: 2024-03-06 08:49:34 浏览: 66
c++链表,解决约瑟夫环问题
5星 · 资源好评率100%
好的,以下是C++链表实现约瑟夫问题的代码,支持用户自定义输入数据:
```c++
#include <iostream>
using namespace std;
// 定义链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 创建循环链表
ListNode* createCircularList(int n) {
ListNode* head = new ListNode(1);
ListNode* cur = head;
for (int i = 2; i <= n; i++) {
cur->next = new ListNode(i);
cur = cur->next;
}
cur->next = head; // 将尾节点指向头节点,形成循环链表
return head;
}
// 约瑟夫问题求解
int josephus(int n, int m) {
ListNode* head = createCircularList(n);
ListNode* cur = head;
while (cur->next != cur) { // 当链表中只有一个节点时跳出循环
for (int i = 1; i < m - 1; i++) { // 找到第 m-1 个节点
cur = cur->next;
}
cout << cur->next->val << " "; // 输出被删除的节点值
ListNode* temp = cur->next; // 删除节点
cur->next = temp->next;
delete temp;
cur = cur->next; // 将 cur 指向下一个节点
}
int ans = cur->val; // 最后剩下的节点即为答案
delete cur;
return ans;
}
int main() {
int n, m;
cout << "Please input the number of nodes: ";
cin >> n;
cout << "Please input the number of each time to delete: ";
cin >> m;
int ans = josephus(n, m);
cout << endl << "The last node is: " << ans << endl;
return 0;
}
```
在这段代码中,我们通过 `cin` 语句允许用户输入节点个数 `n` 和每次删除的第 `m` 个节点,然后调用 `josephus` 函数求解约瑟夫问题。
阅读全文