#include <stdio.h>
#include <iostream>
using namespace std;
//一个双向链表的结点
struct dListNode
{
int data;
dListNode* pre;
dListNode* next;
};
//创建一个双向链表的结点
dListNode* creteListNode(int data)
{
dListNode* newNode = (dListNode*)malloc(sizeof(dListNode));
newNode->data = data;
newNode->next = NULL;
newNode->pre = NULL;
return newNode;
}
//创建一个长度为n的双向链表
dListNode* createList(int n)
{
//首先创造第一个结点
dListNode* first = creteListNode(1);
dListNode* now = first;
for (int i = 2; i <= n; i++)
{
dListNode* newNode = creteListNode(i);
now->next = newNode;
newNode->pre = now;
now = now->next;
}
now->next = first;
first->pre = now;
return first;
}
int main()
{
int n;
cin >> n;
int target;
cin >> target;
dListNode* head = createList(n);
dListNode* now = head;
int total = n;
int nowNum = 1;
while (total > 0)
{
if (nowNum == target)
{
//先输出这个结点
cout << now->data << " ";
//然后删除这个结点
now->next->pre = now->pre;
now->pre->next = now->next;
//删除结点后 重置
now = now->next;
nowNum = 1;
//计算已经输出过一次
total--;
}
else {
nowNum++;
now = now->next;
}
}
}
P1996 约瑟夫问题 | c++
最新推荐文章于 2024-09-23 20:41:21 发布