环形链表的约瑟夫问题

news2024/11/19 10:19:57

前言:

据说著名犹太历史学家Josephus有过如下故事:

在罗马人占领乔塔帕特后,39个犹太人和Josephus及他的朋友躲进一个洞里,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈。

由第一个人开始报数,报数到3的人就自杀,再由下一个人重新报1,报数到3的人就自杀,这样依次下去,知道剩下最后一个人时,那个人可以自由选择自己的命运。

这就是著名的约瑟夫问题。现在请用单向链表描述该结构并呈现整个自杀过程。

目录

题目:

示例:

图例: 

题目解析:

约瑟夫问题的本质:

图例:

删除节点:

未删除,继续报数:

 代码演示:



                                                       

题目:

编号为1到n的n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开,下一个人继续从 1开始报数。

n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?

示例:

  1. 输入:  5  , 2
  2. 返回值:  3

说明 : 

  • 开始 5 个 人  他们的编号分别是 :1,2,3,4,5
  • 从1开始报数,1->1,2->2  编号为2的人离开
  • 剩下:1,3,4,5,从3开始报数,3->1,4->2编号为4的人离开
  • 剩下:1,3,5,从5开始报数,5->1,1->2编号为1的人离开
  • 剩下:3,5,从3开始报敷,3->1,5->2编号为5的人离开
  • 最后留下人的编号是3

图例: 

 

  • 通过图例和题目要求,让我们想到了一种链表,带环链表。
  • 带环链表之所以叫带环链表,是因为最后面的节点内的指针指向了头节点,也就是头尾相连了。
  •  且,带环链表的创建和单链表的创建是一样的,只不过带环链表多了一步,尾节点的指针 next 指向了头节点。

题目解析:

  • 首先,因为题目的要求,需要拥有两个数,一个是指定的次数,一个是节点的个数。

  • 其次,我们要创建链表的节点,而创造链表的节点需要开辟空间,这里需要使用malloc函数,并将开辟的空间交予头节点指针,以此形成第一个节点。

  • 在进行开辟空间后,需要形成链表,而链表中,节点的个数和之前的输入值有关,所以需要进行循环创建节点,对此要和上面开辟节点的函数形成调用联动。
  • 而且,为了使得变成一个环形链表,我们需要在所有节点开辟后,并形成单链表的最后,将链表的最后一个节点内部的指针指向头节点。

  • 在形成节点后我们则进入约瑟夫问题。

约瑟夫问题的本质:

 

如上图所示,我们可以知道,约瑟夫问题的本质实际上就是删除指定位置的节点。

而对于删除指定位置的节点,我们需要两个指针进行遍历解决。

链表——单链表的简单介绍-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/2301_76445610/article/details/133811446?spm=1001.2014.3001.5501

 两个指针:一个是通过遍历访问指定位置(cur),一个是通过遍历访问到指定位置的前一个节点(prev)。

而又如图所示,当最后只剩下一个链表的时候,那一个遍历指定位置的指针指向的节点,该节点内部的指针指向的是它自己。

所以当遍历指定位置 的节点 的内部指针 指向它自己的时候,就是跳出约瑟夫游戏判断的时候。

  • 因为之前返回值是返回环形指针的最后一个尾节点(原单链表尾节点),所有prev是尾节点,而prev->next  则是原单链表的头节点。

  • 而因为我们是从头指针开始的约瑟夫问题的,所以报数是从1开始的,这里我们就需要一个计数(报数)变量。

  • 而接下来,关于约瑟夫问题的核心部分,便是计数和删除节点。
  • 当计数变量抵达我们指定的数字后,需要将节点进行删除,进行修改节点内部指针指向,且将计数变量重置回初始值(重置回1),而未抵达我们指定的数字时,则继续进行计数。

图例:

删除节点:

未删除,继续报数:

 代码演示:

  


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1112512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

24、Flink 的table api与sql之Catalogs(java api操作分区与函数、表)-4

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

Unity3D 关于过大的UI帧动画如何处理详解

Unity3D是一款流行的游戏开发引擎,它可以用来创建各种类型的游戏,包括2D和3D游戏。在游戏中,UI帧动画是一个常见的元素,它可以增加游戏的交互性和视觉效果。然而,当UI帧动画过大时,可能会导致游戏的性能下降…

linux安装新版本git2、配置github-ssh。(centos、aws)

一、安装Git 1、yum默认版本git #1.安装git sudo yum install git -y #2.确认Git已经安装成功 git --version如果要安装较新版本,可以安装一个repo ,但是我这第一次尝试失败了,执行完提示找不到git2u,ius repo也连不上。而且每次…

02HTML功能元素

1.功能元素 1.1.列表标签 ​ 列表标签的作用: 给一堆数据添加列表语义, 也就是告诉搜索引擎告诉浏览器这一堆数据是一个整体 - HTML中列表标签的分类 ​ 无序列表(最多)(unordered list) ​ 有序列表(最少)(ordered list) ​ 定义列表(其次)(definition list) 1.1.1.无序列…

解析Apache Kafka中的事务机制

这篇博客文章并不是关于使用事务细节的教程,我们也不会深入讨论设计细节。相反,我们将在适当的地方链接到JavaDocs或设计文档,以供希望深入研究的读者使用。 为什么交易? 我们在Kafka中设计的事务主要用于那些显示“读-进程-写”模式的应用…

基于SSM的传统文化网站

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

Spring frame :基于 jdk 动态代理实现连接池复用

前言 在数据库开发中,连接池是一种重要的技术手段,它可以提高数据库连接的复用性和性能。连接池的原理是在应用启动时创建一定数量的数据库连接,并将这些连接保存在一个池中,应用程序需要数据库连接时,从连接池中获取…

静态路由与双线BFD热备份

✍ 路由具体是什么概念? ✍ 路由表和路由协议有什么关系? ✍ 电信联通双线如何做路由热备份? ---- 什么叫路由? ---- 路由器 - 网络设备 - 转发数据 - 要有一张地图 - 路由表 ---- 路由表 - 指明要到达某个目…

.NET开源且免费的Windows远程桌面管理软件

前言 今天要给大家推荐一款由.NET开源且免费的远程桌面管理软件:1Remote。 1Remote官方项目介绍 1Remote是一款现代的远程会话管理和启动器,它让你能够在任何时候快速开启一个远程会话。目前1Remote已支持 微软远程桌面(RDP)、VNC、SSH、Telnet、SFTP、…

Unity3D 游戏框架搭建的过程是什么详解

Unity3D 是一款广泛使用的游戏开发引擎,它提供了丰富的功能和工具,使得开发者可以轻松地创建高质量的游戏。在开始开发一个新的游戏项目之前,我们需要搭建一个游戏框架,这个框架将提供一些基本的功能和结构,为后续的开…

CRM自动化意味着什么?企业如何从中受益?

客户关系管理(CRM)软件不再仅仅适用于大公司或销售周期长的行业,它越来越成为各种规模企业的重要工具。 在日常工作中,当你陷入流程的所有细节时,可能会产生不必要的工作。因此,如果你想要CRM提供的组织和…

Python特征选择

1 特征选择的目的 机器学习中特征选择是一个重要步骤,以筛选出显著特征、摒弃非显著特征。这样做的作用是: 减少特征(避免维度灾难),提高训练速度,降低运算开销; 减少干扰噪声,降低过拟合风险…

Leetcode 第 365 场周赛题解

Leetcode 第 365 场周赛题解 Leetcode 第 365 场周赛题解题目1:2873. 有序三元组中的最大值 I思路代码复杂度分析 题目2:2874. 有序三元组中的最大值 II思路代码复杂度分析思路2 题目3:2875. 无限数组的最短子数组思路代码复杂度分析 题目4&a…

Oracle的立场:官网更换首页与以色列站在一起

Oracle公司的官网,更换了首页内容,明确表明立场:Oracle与以色列站在一起。 声明指出: Oracle谴责针对以色列及其公民的恐怖袭击。Oracle将为其员工、以色列政府和国防机构提供一切必要的支持。 Magen David Adom是一家为以色列公民…

Java代码审计-因酷网校在线教育系统-越权漏洞分析

登录个人账号后,点击基本资料。有更新资料的功能。 查看这个页面的html源码,进行代码审计。(这点怎么通过源码怎么找到的就不提了,写上实在啰嗦了。) 代码jsp页面源码如下,查看这个表单信息 注意&#xf…

【Mysql】Mysql中的B+树索引

概述 从上一章节我们了解到InnoDB 的数据页都是由7个部分组成,然后各个数据页之间可以组成一个双向链表 ,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表 ,每个数据页都会为存储在它里边儿的记录生成一个页目录 &#xff…

【AIGC核心技术剖析】大型语言和视觉助手——LLaVA(论文+源码)

🔥 [新!LLaVA-1.5 在 11 个基准测试上实现了 SoTA,只需对原始 LLaVA 进行简单的修改,利用所有公共数据,在单个 1-A8 节点上在 ~100 天内完成训练,并超越使用数十亿级数据的方法。 LLaVA代表了一种新颖的端到端训练大型多模态模型,结合了视觉编码器和骆马 对于通用的视…

微信小程序开发的OA会议之会议个人中心的页面搭建及模板,自定义组件的学习

目录 一.自定义组件及会议效果编写 效果显示 二.个人中心布局 编写结果 ​编辑 一.自定义组件及会议效果编写 在页面中创建一个以components命名的项目来存放组件 再在components文件夹中创建一个组件,名为 :tabs ,创建操作如图所示 刚刚创建好会报…

Android中级——MVVM

MVVM MVVM是什么?MVVM实现前提ModelViewModelView MVVM是什么? Model-View-ViewMode架构,可看作MVP改进版,将此前Presenter的逻辑操作交给ViewMode中的Binder去处理 Mode:封装数据存储及相关操作逻辑,与MV…

LeetCode 799. 香槟塔【数组,模拟,简单线性DP】1855

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…