#include using namespace std;

// 定义节点类 class Node { public: int val; // 节点的值 Node* next; // 指向下一个节点的指针 Node(int v) { // 构造函数,初始化节点的值和指针 val = v; next = NULL; } };

// 定义循环链表类 class CircularList { private: Node* head; // 链表头节点指针 Node* tail; // 链表尾节点指针 int size; // 链表的大小 public: CircularList(int n) { // 构造函数,初始化链表 head = NULL; tail = NULL; size = 0; for (int i = 1; i <= n; i++) { // 循环添加n个节点 add(i); } } void add(int val) { // 向链表中添加一个节点 if (head == NULL) { // 如果链表为空,新建一个节点作为头节点 head = new Node(val); tail = head; head->next = tail; } else { // 如果链表不为空,将新节点添加到尾节点后面 tail->next = new Node(val); tail = tail->next; tail->next = head; // 将尾节点的指针指向头节点,形成循环链表 } size++; // 链表大小加1 } int remove(int m) { // 从链表中删除第m个节点 Node* cur = head; // 当前节点指针指向头节点 Node* prev = tail; // 前一个节点指针指向尾节点 while (size > 1) { // 循环直到链表只剩下一个节点 for (int i = 1; i < m; i++) { // 找到要删除的节点的前一个节点和当前节点 prev = cur; cur = cur->next; } prev->next = cur->next; // 将前一个节点的指针指向当前节点的下一个节点,跳过当前节点 Node* temp = cur; // 保存当前节点指针 cur = cur->next; // 将当前节点指针指向下一个节点 delete temp; // 释放当前节点内存 size--; // 链表大小减1 } int result = head->val; // 保存链表中唯一剩下的节点的值 delete head; // 释放唯一剩下的节点内存 head = NULL; tail = NULL; size = 0; // 将链表清空 return result; // 返回唯一剩下的节点的值 } };

int main() { int n, m; cin >> n >> m; CircularList list(n); // 新建一个n个节点的循环链表 int count = 1; while (list.size > 0) { // 循环直到链表为空 count %= m; // 计算出下一个要删除的节点的位置 if (count == 0) { // 如果位置为0,说明要删除的是最后一个节点 count = m; } int val = list.remove(count); // 删除第count个节点,并返回节点的值 cout << val; // 输出节点的值 } cout << endl; return 0; }

#include iostream using namespace std; class Node public int val; Node next; Nodeint v val = v; next = NULL; ; class CircularList private Node head; Node tail; int size;

原文地址: http://www.cveoy.top/t/topic/bqvy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录