代码生成c++链表实现约瑟夫问题
时间: 2023-08-02 13:09:10 浏览: 101
约瑟夫问题链表实现 C++源代码 数据结构与算法实验 acm.txt
好的,以下是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 = 5, m = 3; // n 为节点个数,m 为每次删除的第 m 个节点
int ans = josephus(n, m);
cout << endl << "The last node is: " << ans << endl;
return 0;
}
```
这段代码中,我们首先定义了一个链表节点的结构体 `ListNode`,其中 `val` 表示节点的值,`next` 表示指向下一个节点的指针。
接着,我们通过 `createCircularList` 函数创建了一个循环链表,并将链表的尾节点指向头节点,使链表形成闭环。
最后,我们通过 `josephus` 函数求解约瑟夫问题。该函数中,我们首先将链表的头节点赋值给 `cur`,然后通过循环,每次找到第 m-1 个节点,并删除第 m 个节点。当链表中只有一个节点时,跳出循环,将最后剩下的节点的值赋值给 `ans`,作为函数返回值。
阅读全文