### 题目描述
有n个人,编号为1~n,围成一个圈,从第一个人开始报数,报到m的出列,再由下一个人开始从1往后报,直到所有人出列,请依次输出出列人的编号
#### 样例
输入:10 3
输出:3 6 9 2 7 1 8 5 10 4
概述:创建一个动态链表,且是头尾相连的循环链表
优点是能及时释放内存
缺点是需要管理空间,容易出错
#include<iostream>
using namespace std;
//链表节点的定义
struct node{
int data;
node *next;
};
int main()
{
//这里开始是构建循环链表
int n,m;
cin>>n>>m;
node * head , *p, *now, *prev; //定义变量
head = new node; head ->data=1; head->next=NULL;//设置头节点
now = head; //当前指针设成头节点
for(int i=2;i<=n;i++)
{
p = new node; p->data=i; p->next=NULL; //设置新结点
now->next=p; //尾插
now=p;
}
now->next=head; //最后把尾节点指向头节点就构成了循环链表
//这里开始我们利用链表返回报数的人的数据
now = head ,prev = head;
while((n--)>1) //每次出去一个人所以循环n遍,但是因为最后一个输出不带空格所以单独处理,实际上是n-1次
{
for(int i=1;i<m;i++)
{
prev=now;
now=now->next; //数n个节点,当前now就是我们要返回的节点
}
printf("%d ",now->data); //这里有空格
prev->next=now->next; //跳过这个节点
delete now; //删除这个节点
now=prev->next;
}
printf("%d",now->data); //最后一个没有空格
delete now;
return 0;
}