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

环形链表的约瑟夫问题

一:题目

二:思路

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

因为是从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;}

 

 

 

 

 

相关文章:

  • Python精选200Tips:176-180
  • 在ESPnet使用Makefile安装PyTorch和相关依赖的详细教程
  • 嵌入式学习--LinuxDay04
  • Cadence23中的一些设置
  • MAC-Win11虚拟机双VPN环境内网穿透解决思路
  • 【分布式微服务云原生】Dockerfile命令详解
  • OJ在线评测系统 后端判题机架构搭建 使用原生实现Java安全管理器环境隔离
  • 付费计量系统标准化未来展望
  • 【源码】询比价管理系统,招投标采购管理系统
  • 【滑动窗口算法】——定长滑动窗口——Python(附题)
  • vue2 将页面生成pdf下载
  • MYSQL-查看函数创建语句语法(五)
  • Ubuntu/Debian网络配置(补充篇)
  • 解决方案:如何区分python里面绝对路径跟相对路径的不同
  • SIP 会议信令
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • happypack两次报错的问题
  • Java IO学习笔记一
  • Python - 闭包Closure
  • Terraform入门 - 3. 变更基础设施
  • 前端技术周刊 2019-01-14:客户端存储
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 让你的分享飞起来——极光推出社会化分享组件
  • 提醒我喝水chrome插件开发指南
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ​520就是要宠粉,你的心头书我买单
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #在 README.md 中生成项目目录结构
  • $.ajax()参数及用法
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (2)nginx 安装、启停
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (javascript)再说document.body.scrollTop的使用问题
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)nsfocus-绿盟科技笔试题目
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .cn根服务器被攻击之后
  • .Net 6.0 处理跨域的方式
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET 中让 Task 支持带超时的异步等待
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @RequestMapping用法详解
  • [ C++ ] STL---stack与queue
  • [Android]使用Retrofit进行网络请求
  • [C#]DataTable常用操作总结【转】
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [C#]将opencvsharp的Mat对象转成onnxruntime的inputtensor的3种方法
  • [C语言]-基础知识点梳理-编译、链接、预处理
  • [iOS]如何删除工程里面用cocoapods导入的第三方库