约瑟夫环C++笔试题

约瑟夫环经典问题,自己刚好学习到。记录一下,利用循环链表实现的。
场景:N个人围一桌,从第k个人开始报数,报到m的人离开桌子,再从下一个人开始报数直到所有人均离开桌子。
基本思路:建立一个循环链表,不断按上述规律删除第m个元素,直到所有元素被删除。
1) 首先建立节点结构体(数据+下一节点地址)
2)借鉴网上其他代码建立linklist类,感觉其实不用这个类一样可以实现,使用后反而迷惑初学者。
该类建立的目的主要是建立种子节点链表,并声明子函数。
3)然后输子函数,重点在建立包含全部节点的循环链表、然后找准起始节点,其后找到第K个节点;以该节点为起点数到要删除的节点,删除之;然后将下一节点next作为当前节点。依次循环n次



#include<iostream>
using namespace std;
struct node
{
	int date;
	node *next;
};
class linklist
{
public:
	linklist()
	{
		node *p = new node();
		p->date = 1;
		p->next = p;
		first = p;
	};
	void josephus(int n,int k,int m);

private:
	node *first;
};
void linklist::josephus(int n, int k, int m)
{
	node *p=first;
	for (int i = 2; i < n+1; i++)
	{
		node *q = new node();
		q->date = i;
		q->next = p->next;
		p->next = q;
		p = q;
	}
	//数到第k个节点,使其为当前节点
	p = first;
	node *temp = p;//这个temp初始值保证了第一次开始计数到m的第一个元素与其后各循环删除元素起始点不一致情况下,循环体可正常运行。
	while (--k)
		p = p->next;
	
	while (n--)
	{
		for (int i = 1; i < m; i++)
		{
			temp = p;
			p = p->next;
		}
		cout << p->date<<"   ";
		temp->next = p->next;
		p = temp->next;
	}
	cout <<endl;
}
int main()
{
	int n = 9, k = 1, m =5;
	linklist L;
	L.josephus(n, k, m);
	system("pause");
	return 0;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值