单链表实现约瑟夫环

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

约瑟夫环
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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,一经查实,立即删除!

相关文章

Android 10.0 系统sim卡4G LTE信号格数对应的信号强度值修改

1.前言 在10.0的系统产品开发中,在手机通讯这块功能也是特别重要的,在手机插入手机sim卡后,会根据当前的sim卡信号来显示对应的 sim卡信号显示格数,所以为了增强相关的信号格数,就需要修改sim卡对应的信号强度值来实现相关的功能 2.系统sim卡4G LTE信号格数对应的信号强…

分享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/ 点击上方的电视软件。 可以进入下载软…

中兴R5300G4服务器查看服务器、主板序列号及硬盘RAID信息

本文在操作系统带内通过指令操作查看中兴R5300G4服务器、主板序列号及硬盘RAID信息。 一、中兴R5300G4服务器查看服务器、主板序列号 在Linux服务器上&#xff0c;可以使用dmidecode命令来查看服务器的硬件相关信息&#xff0c;由于该命令要读取系统的硬件信息&#xff0c;因…

阅读《极客时间 | 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…

Vue3.0(四):Composition API的使用

Composition API 认识Composition API 前几篇文章中主要用Options API进行编写代码&#xff0c;但是有一些弊端 Options API弊端 在 Options API中&#xff0c;有data、watch、computed、methods以及生命周期函数各种各样的选项而一个变量&#xff0c;为了实现某个功能&#x…

【数据分析岗】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工具…

LeetCode 二叉树/n叉树的解题思路

二叉树 二叉树特点是每个节点最多只能有两棵子树&#xff0c;且有左右之分二叉树的数据结构如下&#xff1a; public class TreeNode {//节点的值int val;//左子树TreeNode left;//右子树TreeNode right;TreeNode(int x) { val x; } }树节点的初始化&#xff1a; int val1;T…

Flink Checkpoint过程

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

机器学习与深度学习

什么是机器学习 机器学习是一门跨学科的学科&#xff0c;它致力于研究和开发让计算机能够模拟人类学习行为的技术和方法。机器学习涉及多个学科的知识&#xff0c;如概率论、统计学、逼近论、凸分析、算法复杂度理论等&#xff0c;这些学科为机器学习提供了理论基础和数学工具…

【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…

nginx:配置内网转发阿里云oss图片加水印

图片水印文档 https://help.aliyun.com/zh/oss/user-guide/add-watermarks nginx配置如下 location ^~ /oss/ {if ( $request_uri ~* \.(png|jpg|jpeg) ){set $args "x-oss-processstyle/watermark";}proxy_pass http://<bucket>.oss-cn-beijing-internal.al…

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

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

FlinkSql通用调优策略

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

netstat: 未找到命令

当您在Linux系统中遇到“netstat: 未找到命令”的提示时&#xff0c;这通常意味着您的系统上没有安装netstat工具。Netstat是一个用于显示网络连接、路由表、接口统计等网络相关信息的命令行工具。 要解决这个问题&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 打开…