很经典的一道题目,放上洛谷链接:
P1996
这道题可以使用数组实现,但是也可以用另一种方法也就是我们今天所要说的链表做法,在这道题中,相比数组做法,链表做法还是相对快一些的。
大题思路就是用指针来建一个成环的链表,然后从一号点开始往后找到第 m m m 个点,将其所对应的标号输出,然后删除这个点并将这个点两边的点连接起来,重复此步骤,直到最后链表中还剩下一个点,单独输出即可。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int d;
node *e;//指针结构体,用来构建量表
};
int n,m;
node *u,*h,*p;
//*h用于开头连接,*u用于链表构造,*p用于找点并删除
int main()
{
scanf("%d%d",&n,&m);
h=u=new node;//不能分开写,否则h与u就不会相连
//u=new node;
h->d=1;//开始
for(int i=2;i<=n;i++){
u->e=new node;//创建链表
u=u->e;//连接
u->d=i;//别忘了记录点
}
u->e=h;//尾结点
while(n!=1){
for(int i=1;i<m;i++)
u=u->e;//找
p=u->e;//第m个点
u->e=p->e;//将此点前后两个点连接
printf("%d\n",p->d);
delete p;//删除
n--;
}
printf("%d\n",u->d);
return 0;
}
完结撒花~~