约瑟夫问题(链表)

这篇博客介绍了如何使用链表数据结构解决洛谷P1996问题,通过建立环形链表并遍历找到第m个节点,展示了链表在解决此类问题时的高效性。作者给出了详细的代码实现和思路分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很经典的一道题目,放上洛谷链接:

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;
}

完结撒花~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值