单链表实现约瑟夫环

大家对约瑟夫环是比较陌生的,但是对于大多数人来说,丢手绢却一点都不陌生,其实约瑟夫环和丢手绢差不多。

约瑟夫环
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。
详见百度百科约瑟夫环.
在本篇博客中,我将是以一个单链表围成一个环,然后从第一个结点开始报数,当数到3的时候的那个结点就被抛出,然后从下一个开始又重新从1开始继续报数,从而留下最后一个结点,就是约瑟夫点(我自己瞎猜的);
下面是我画的一个对于一共有8个结点的环,每次报到3的时候就删除这个结点的展示图:

这里写图片描述

第一步:从1开始报数为3的时候就删除3号结点
第二步:从4号结点开始报数,当为3的时候删除6号结点;
第三步:从7号结点开始报数,当为3的时候删除1号结点;
第四步:从2号结点开始报数,当为3的时候删除5号结点;
第五步:从7号结点开始报数,当为3的时候删除2号结点;
第六步:从4号元素开始报数,当为3的时候删除8号结点;
第七步:又从4号开始报数,当为3的时候删除4号结点,此时链表中只有一个7号结点,所以最后的结点就是7号结点;

大概思路我们都有了,所以我们事先代码如下:

#include<iostream>
#include<assert.h>
using namespace std;typedef int DataType;
typedef struct Node
{DataType _data;struct Node* _pNext;
}Node, *PNode;Node* BuyNode(DataType data) //创建新结点
{PNode newNode = NULL;newNode = (PNode)malloc(sizeof(Node));if (NULL == newNode){printf("out of memory\n");return NULL;}else{newNode->_data = data;newNode->_pNext = NULL;}return newNode;
}void InitList(PNode* pHead)  //初始化链表
{assert(pHead);*pHead = NULL;
}void PushBack(PNode* pHead, DataType data) //尾插
{assert(pHead);if (*pHead == NULL)*pHead = BuyNode(data);else{PNode pPreNode = *pHead;PNode pCurNode = BuyNode(data);while (pPreNode->_pNext)pPreNode = pPreNode->_pNext;pPreNode->_pNext = pCurNode;}
}PNode Front(PNode pHead) //返回第一个结点
{if (NULL == pHead)return NULL;PNode pPreNode = pHead;return pPreNode;
}PNode Back(PNode pHead) //返回最后一个结点
{if (NULL == pHead)return NULL;PNode pPreNode = pHead;while (pPreNode->_pNext && pPreNode)pPreNode = pPreNode->_pNext;return pPreNode;
}PNode JosephCircle(PNode* pHead, int m)//约瑟夫环
{int count = m;PNode pPreNode = *pHead;PNode pCurNode = NULL;assert(pHead);if (NULL == *pHead)return NULL;while (pPreNode->_pNext != pPreNode){count = m;while (--count){pCurNode = pPreNode;pPreNode = pPreNode->_pNext;}pCurNode->_pNext = pPreNode->_pNext;free(pPreNode);pPreNode = pCurNode->_pNext;}return pPreNode;
}int main()
{PNode pHead, pBackNode, pFrontNode;PNode tmp1;InitList(&pHead);PushBack(&pHead, 1);PushBack(&pHead, 2);PushBack(&pHead, 3);PushBack(&pHead, 4);PushBack(&pHead, 5);PushBack(&pHead, 6);PushBack(&pHead, 7);PushBack(&pHead, 8);pBackNode = Back(pHead);pFrontNode = Front(pHead);pBackNode->_pNext = pFrontNode;tmp1 = JosephCircle(&pHead, 3);cout << tmp1->_data << endl;return 0;
}

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

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

相关文章

分享78个行业PPT,总有一款适合您

分享78个行业PPT&#xff0c;总有一款适合您 78个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/19UL58I5Z1QZidVrq50v6fg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

海信电视安装第三方软件-电视家分享(侵权联系作者删除)

1.海信电视安装第三方软件电视家&#xff0c;相对来说还是比较复杂的。首先要准备电视安装包&#xff0c;一般来说是电视家海信专用安装包&#xff0c;大家可以搜索电视家的官方网站。这里附上官网地址https://www.tvapk.net/dianshijia/ 点击上方的电视软件。 可以进入下载软…

阅读《极客时间 | Kafka核心技术与实战》(一)【Kafka入门】

阅读《极客时间 | Kafka核心技术与实战》 为什么要学习Kafka消息引擎系统ABC一篇文章带你快速搞定Kafka术语我应该选择哪种Kafka&#xff1f;聊聊Kafka的版本号 为什么要学习Kafka 如果你是一名软件开发工程师的话&#xff0c;掌握 Kafka 的第一步就是要根据你掌握的编程语言去…

MPLS VPN功能组件(2)

MP-BGP 采用地址族(Address Family)来区分不同的网络层协议,以便正确处理VPN-IPv4路由 传统的BGP-4(RFC1771)只能管理IPv4的路由信息,无法正确处理地址空间重叠的VPN的路由。 为了正确处理VPN路由,VPN使用RFC2858(Multiprotocol Extensions for BGP-4)中规定的MP-BG…

【数据分析岗】8家知名企业秋招(含实习)面试题汇总

年底了&#xff0c;技术群组织了一场机器学习算法岗技术&面试讨论会&#xff0c;邀请了一些同学分享他们的面试经历&#xff0c;讨论会会定期召开&#xff0c;如果你想加入我们的讨论群或者希望要更详细的资料&#xff0c;文末加入。 喜欢本文记得收藏、关注、点赞 文章目…

力扣精选算法100道—— 连续数组(前缀和专题)

连续数组&#xff08;前缀和专题&#xff09; 目录 &#x1f6a9;了解题意 &#x1f6a9;算法原理 ❗为什么hash设置成<0,-1>键值对 ❗与和为K的子数组比较hash的键值对 &#x1f6a9;代码实现 &#x1f6a9;了解题意 我们看到给定数组里面只有0和1&#xff0c;我们…

植物生长调节剂行业调研:预计2029年将达到1.2亿美元

未来增长的重点势必在以中国为代表的亚太地区。尤其在我国农业现代化、无人化发展需求下&#xff0c;提升种植的效率和品质是必然需求&#xff0c;我国市场规模增速也将高于全球平均水平。植物生长调节剂的应用具有成本低、收效快、效益高、节省劳动力的优点&#xff0c;不仅对…

Elasticsearch:使用 LangChain 文档拆分器进行文档分块

使用 Elasticsearch 嵌套密集向量支持 这个交互式笔记本将&#xff1a; 将模型 “sentence-transformers__all-minilm-l6-v2” 从 Hugging Face 加载到 Elasticsearch ML Node 中使用 LangChain 分割器将段落分块成句子&#xff0c;并使用嵌套密集向量将它们索引到 Elasticse…

fghbbbbbbbbbb

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

Flink Checkpoint过程

Checkpoint 使用了 Chandy-Lamport 算法 流程 1. 正常流式处理&#xff08;尚未Checkpoint&#xff09; 如下图&#xff0c;Topic 有两个分区&#xff0c;并行度也为 2&#xff0c;根据奇偶数 我们假设任务从 Kafka 的某个 Topic 中读取数据&#xff0c;该Topic 有 2 个 Pa…

【Linux】gdb调试与make/makefile工具

目录 导读 1. make/Makefile 1.1 引入 1.2 概念 1.3 语法规则 1.4 示例 2. Linux调试器-gdb 2.1 引入 2.2 概念 2.3 使用 导读 我们在上次讲了Linux编辑器gcc\g的使用&#xff0c;今天我们就来进一步的学习如何调试&#xff0c;以及makefile这个强大的工具。 1. mak…

人工智能基础部分24-人工智能的数学基础,汇集了人工智能数学知识最全面的概况

、 大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能基础部分24-人工智能的数学基础&#xff0c;汇集了人工智能数学知识最全面的概况&#xff0c;深度学习是一种利用多层神经网络对数据进行特征学习和表示学习的机器学习方法。要全面了解深度学习的数学基…

FlinkSql通用调优策略

历史文章迁移&#xff0c;稍后整理 使用DataGenerator 提前进行压测&#xff0c;了解数据的处理瓶颈、性能测试和消费能力 开启minibatch&#xff1a;"table.exec.mini-batch.enabled", "true" 开启LocalGlobal 两阶段聚合&#xff1a;"table.exec.m…

Leetcode 2641. 二叉树的堂兄弟节点 II

本题为修改给定二叉树中结点的值&#xff0c;修改的规则为&#xff1a;将原来的值替换为该结点所有堂兄弟结点值的和。 其实我们可以延申一下题意&#xff0c;怎样去计算该结点所有堂兄弟结点值的和&#xff1f;其实只需要先计算每一层所有结点的和&#xff0c;再减掉其本身的…

《学成在线》微服务实战项目实操笔记系列(P1~P62)【上】

《学成在线》项目实操笔记系列【上】&#xff0c;跟视频的每一P对应&#xff0c;全系列12万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。同时也欢迎大家提问与讨论&#xff0c;我会尽力帮大家解…

nginx登录用户验证配置

我们的nginx端口一般都是对外开放的&#xff0c;所以有一定程度上有被别人扫描的风险&#xff0c;所以为了减少被扫描的风险&#xff0c;我们可以配置一个nginx的用户登录验证&#xff1b; 用户验证登录需要nginx的一个模块&#xff1a;ngx_http_auth_basic_module 我们使用…

进程间通信(4):消息队列

先进先出&#xff0c;保证信息的有序性。 函数&#xff1a;msgget(搭配ftok)、msgsnd、msgrcv、msgctl 实现流程&#xff1a; 1、创建消息队列IPC对象 msgget 2、通信(内置函数&#xff1a;msgsnd、msgrcv) 3、删除消息队列IPC对象 msgctl write.c /* * 文件名称&…

PyTorch 2.2 中文官方教程(八)

训练一个玛丽奥玩游戏的 RL 代理 原文&#xff1a;pytorch.org/tutorials/intermediate/mario_rl_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整的示例代码 作者&#xff1a; 冯元松, Suraj Subramanian, 王浩, 郭宇章。 这个…

谈谈安全对抗的本质

前言 红队和蓝队的兄弟们都辛苦了&#xff0c;趁夜深人静的时候写了一点东西&#xff0c;算是一点心得与体会&#xff0c;谈谈安全对抗的本质&#xff0c;仅供大家参考。 今年的活动&#xff0c;笔者和去年一样&#xff0c;镇守公司&#xff0c;运筹帷幄之中&#xff0c;决胜千…

2/7 算法每日N题(二分+双指针)

第一题&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size() - 1;while(left < right){int mid (right - left) / 2 left;int num nums[mid];if (num target) {return mid;} else if (num >…