当前位置: 首页 > article >正文

环形链表的约瑟夫问题

一:题目

二:思路

前提:该题已经声明了结构体,只是看不见,声明如下:

因为是从0开始实现:

1:创建一个n个节点的循环链表,其值为1~n(假设n = 5)

如图:

代码如下: 
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
	if (newnode == NULL)
	{
		perror("malloc failed");
		return NULL;
	}

	newnode->val = i;
	newnode->next = NULL;

	return newnode;

}
struct ListNode* CreatList(int n)
{
	int i = 1;
	struct ListNode* head = NULL;
	struct ListNode* tail = NULL;

	while (i <= n)
	{

		struct ListNode* newnode = BuyNode(i++);
		if (tail == NULL)
		{
			head = tail = newnode;
		}
		else
		{
			tail->next = newnode;
			tail = tail->next;
		}
	}
	tail->next = head;

	return head;
}
代码解释:

a:用了一个BuyNode函数,来创造节点

b:循环中BuyNode的参数是i++,得到的节点的值从1到n(因为i<=n)

第一次得到节点:

非第一次得到节点:tail进行移动就行。

c:最后得到的五个节点是一个单链表,需要tail的next指向head才能形成循环链表

 

2:约瑟夫函数的实现

假设m = 2 ,即报数到2的人离开

流程如下:

 

代码如下:
int ysf(int n, int m) {

	struct ListNode* head = CreatList(n);

	struct ListNode* cur = head;
	struct ListNode* prev = NULL;
	int i = 1;

	while (cur != cur->next)
	{
		if (i == m)
		{
			prev->next = cur->next;
			cur = prev->next;
			i = 1;
		}
		else
		{
			prev = cur;
			cur = cur->next;
			i++;
		}
	}
	return cur->val;

}
代码解释:

1:cur的next是自己,就代表只有一个节点了,不再进入循环

2:i代表报数的数字,i没到2,则prev和cur双双向后移动

3:i到2,则进行cur节点的移除,然后根据题目要求,i=1,重新开始报数

4:最后只有一个节点,返回其值。 

三:总代码

struct ListNode* BuyNode(int i)
{
	struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
	if (newnode == NULL)
	{
		perror("malloc failed");
		return NULL;
	}

	newnode->val = i;
	newnode->next = NULL;

	return newnode;

}
struct ListNode* CreatList(int n)
{
	int i = 1;
	struct ListNode* head = NULL;
	struct ListNode* tail = NULL;

	while (i <= n)
	{

		struct ListNode* newnode = BuyNode(i++);
		if (tail == NULL)
		{
			head = tail = newnode;
		}
		else
		{
			tail->next = newnode;
			tail = tail->next;
		}
	}
	tail->next = head;

	return head;
}

int ysf(int n, int m) {

	struct ListNode* head = CreatList(n);

	struct ListNode* cur = head;
	struct ListNode* prev = NULL;
	int i = 1;

	while (cur != cur->next)
	{
		if (i == m)
		{
			prev->next = cur->next;
			cur = prev->next;
			i = 1;
		}
		else
		{
			prev = cur;
			cur = cur->next;
			i++;
		}
	}
	return cur->val;

}

 

 

 

 

 


http://www.kler.cn/news/327617.html

相关文章:

  • 计算机网络基础--认识协议
  • 【测试】混沌工程
  • 滚雪球学MySQL[7.3讲]:数据库日志与审计详解:从错误日志到审计日志的配置与使用
  • [含文档+PPT+源码等]精品大数据项目-基于Django实现的高校图书馆智能推送系统的设计与实现
  • 中国雕塑——孙溟㠭浅析《瘗鹤铭》
  • jmeter中token测试
  • pycharm 配置篇
  • 鸡兔同笼,但是线性代数
  • ubuntu卸载VSFTPD
  • SSH远程连接保持长时间不断开
  • 鸿蒙NEXT开发-自定义构建函数(基于最新api12稳定版)
  • react+antdMobie实现消息通知页面样式
  • 大模型部署——NVIDIA NIM 和 LangChain 如何彻底改变 AI 集成和性能
  • 原生 React Native 和 Expo对比
  • 玄武星辰大阵——软件终端架构思维———未来之窗行业应用跨平台架构
  • Linux shell编程学习笔记84:tee命令——显示保存两不误
  • 微信小程序:一个小程序跳转至另一个小程序
  • 理解C语言之深入理解指针(四)
  • 基于Springboot+Vue的基于协同过滤算法的个性化音乐推荐系统 (含源码数据库)
  • WMware安装WMware Tools(Linux~Ubuntu)
  • 共筑数据安全防线!YashanDB与SPU完成兼容性互认证
  • 《蓝桥杯算法入门》(C/C++、Java、Python三个版本)24年10月出版
  • Python的异步编程
  • 【分布式微服务云原生】gRPC与Dubbo:分布式服务通信框架的双雄对决
  • DAY81服务攻防-开发框架安全SpringBootStruts2LaravelThinkPHPCVE 复现
  • SOMEIP_ETS_142: SD_Request_non_existing_Major_Version
  • 速盾:游戏用CDN可以吗?
  • 桥接(桥梁)模式
  • Android DataBinding的使用
  • pytorch之自动求导