手撕C语言题典——环形链表的约瑟夫问题

目录

前言 

一.故事背景

二.题目 

​编辑三.思路

1)数组

​编辑2) 循环链表

四.代码实现 


搭配食用更佳哦~~

数据结构之单单单——链表-CSDN博客

数据结构之单链表的基本操作-CSDN博客

前面学了单链表的相关知识,我们来尝试做一下关于顺序表的经典算法题~ 

前言 

      这次是牛客上的一道题,是循环链表的经典应用,讲的是一个老六用自己的聪明才智躲过被杀的命运。

环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/41c399fdb6004b31a6cbb047c641ed8a?tpId=196&tqId=37145&ru=/exam/oj

一.故事背景

        Josephus 问题是一个古老而著名的问题,最早的记载来自犹太历史学家弗拉维奥·约瑟夫斯(FlaviusJosephus),他在犹太战争中被罗马军队包围,为了不被俘虏,他和他的 39 个战友决定自杀,但是他们并不想自己亲手杀死自己,于是决定站在一个圆圈里,从一个人开始,每报数到第 14 个人,第 14 个人就会被杀掉,然后从下一个人开始重新报数,直到最后只剩下一个人,那个人就可以幸存。

Josephus(真是纯老六)要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

二.题目 

三.思路

1)数组

 用数组的话我们需要先申请空间,然后再计数,每记到2就嘎掉它,可以给他赋值一个数组不存在的数比如 0 ,当报数到最后一个时我们需要返回数组最开始也就是下标为 0的时候,当剩下最后一个时就得到了活着的那一个,因为数组比较麻烦而且本篇要讲的是环形链表,所以这个代码就不写了,仅叙述一下思路

2) 循环链表

     顾名思义,循环链表就是把原本线性的链表成环,如何实现呢?我们都知道链表尾节点指针指向NULL,所以我们把这个指针指向头节点就可以搞出一个循环链表。

  和上一个思路一样,我们依旧让他们循环报数,报到 2 的嘎掉,在删除这个节点的同时我们需要将前一个节点的 next 指针指向被嘎节点的下一个指针,这样才能使链表连续起来

虽然画的蛮乱的,大致意思一样,最终结果就是第三个节点自己指向自己。

总结思路就两步:

  • 创建带环链表
  • 计数,嘎节点

四.代码实现 

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整型 * @param m int整型 * @return int整型*/
#include <stdlib.h>
typedef struct ListNode ListNode;
//创建节点
ListNode* buyNoded(int x){ListNode* node = (ListNode*)malloc(sizeof(ListNode));if (node == NULL) {exit(1);}node->val = x;node->next = NULL;return node;
}
//创建带环链表
ListNode* createCircle(int n){ListNode* phead = buyNoded(1);ListNode* ptail = phead;for (int i = 2; i<= n; i++) {ptail->next = buyNoded(i);ptail = ptail->next;}ptail->next = phead;return ptail;
}
int ysf(int n, int m ) {// write code here//创建带环链表ListNode* prev = createCircle(n);ListNode* pcur = prev->next;int count = 1;//当链表中只有一个节点的情况while (pcur->next != pcur) {if (count == m) {//销毁pcur节点prev->next = pcur->next;free(pcur);pcur = prev->next;count = 1;}else {//此时不需要销毁节点prev = pcur;pcur = pcur->next;count++;}}//剩下的就是要返回的值了return pcur->val;
}

这道题到这就结束啦~虽然循环链表写起来比较麻烦要封装好多函数,但封装完就好写啦~~

    🎈🎈完结撒花🎈🎈  

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

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

相关文章

centos 把nginx更新到最新版本

yum install epel-release # 添加 EPEL 软件仓库&#xff0c;这是 Nginx 官方软件仓库的依赖项 yum install yum-utils # yum-utils 包含了 yum-config-manager 工具&#xff0c;它可以让您轻松地启用、禁用或配置 yum 软件仓库 vi /etc/yum.repos.d/nginx.repo # 增加以下内容…

灌区信息化管理平台系统包含哪些内容?(全面介绍)

政策背景 2022年12月29日&#xff0c;水利部启动48处大中型灌区开展数字孪生灌区先行先试建设。 2023年2月24日&#xff0c;《2023年农村水利水电工作要点》:2023年农村水利水电工作的总体思路包括:紧盯保障国家粮食安全&#xff0c;加快推进大中型灌区现代化改造&#xff0c;…

Linux repo包安装Nginx

Linux repo包安装Nginx 1. 将nginx.repo 文件拷贝到 /etc/yum.repos.d 目录2.找到原来的NGINX配置文件打包备份3.执行Nginx安装命令4. 重启 nginx -s reload5. 查看Nginx版本 1. 将nginx.repo 文件拷贝到 /etc/yum.repos.d 目录 cp nginx.repo /etc/yum.repos.d2.找到原来的…

jQuery 入门:轻松创建与插入节点

在Web开发中&#xff0c;动态地创建和管理DOM&#xff08;文档对象模型&#xff09;节点是一项基本且强大的技能。jQuery&#xff0c;作为JavaScript的一个流行库&#xff0c;以其简洁的API简化了这一过程。本文将通过一个简单的示例&#xff0c;介绍如何使用jQuery来创建新的D…

【力扣一轮】链表-删除链表指定值的元素

删除链表指定元素 力扣链接 代码随想录题解 分为两个版本&#xff0c;一个是带有虚拟头节点&#xff0c;一个是不带。 无论是带有还是不带有&#xff0c;我都遇到了这几个问题&#xff1a; ①while循环时的判断&#xff0c;首先要判断当前节点是否为空&#xff0c;接着才能…

bmi088-linux驱动(I2C)

电气特性&#xff1a; 在正常工作时&#xff0c;gyro 工作电流为5mA&#xff0c;acc 工作电流为150uA。 SPI 时钟和数据电平范围 0 -3.6 结构框图如下&#xff1a; 硬件连接图如下&#xff1a; note&#xff1a; 1. 通过PS引脚选择通讯协议&#xff0c;上拉引脚则选择的是I2C…

系统定期执行命令的方法

系统定期执行命令的方法 一、进入超级用户下 执行命令&#xff1a;sudo su 二、添加要执行的命令 例子&#xff1a;每天0点执行一次myapp.sh命令 先后输入&#xff1a;crontab -e、 1、 回车 设置每天0点执行一次myapp.sh操作&#xff0c;需要写绝对路径 含义&#xff1…

离线修复.dll,Microsoft Visual C++

在安装mysql时遇到下面的问题&#xff0c;如果是有网络的情况下微软管网下载安装就行了&#xff0c;用的服务器不允许连接互联网。 后面经过寻找&#xff0c;找到了一个修复工具&#xff0c;可一次修复所有的问题&#xff0c;特别好用分享给宝子们。 下载链接&#xff1a;http…

树莓派 4B putty远程连接登录显示拒绝访问,密码修改

putty显示拒绝访问 可能是树莓派的ip没有找到正确的 在下载系统镜像的时候&#xff0c;会提示设置wifi 这里设置的WiFi和密码需记住&#xff0c;主机名也需记住 可以在手机打开热点&#xff08;将热点的账号和密码改为跟你设置的wifi一样的&#xff09; 可以在手机后台查看…

页面埋点H5 大数据uniapp 按需要更改代码就行

逻辑思路 跳转页面前&#xff0c;记录当前页面的信息停留的时长以及各种信息&#xff0c;然后等走的时候再将记录的信息发送出去 1.记录当前页面信息的函数 // 埋点通用接口 // triggerType: 必传 类型 entryStr(进入) || leaveStr(离开) || String:自定义事件描述 // pageU…

微信小程序支付教程

微信小程序支付教程 Person&#xff1a; 微信小程序支付有几种版本&#xff0c;分别是什么&#xff0c;写一个详细教程介绍下 ChatGPT&#xff1a; 微信小程序支付主要有两种版本&#xff0c;分别为&#xff1a;JSSDK版本&#xff08;v1.0&#xff09;和WeixinJSBridge版本&…

超宽输送带耐热性能怎么样

超宽输送带耐热性能解析 随着工业领域的不断发展和技术革新&#xff0c;超宽输送带的应用越来越广泛。这种输送带在冶金、建筑、化工等多个行业中发挥着至关重要的作用&#xff0c;特别是在高温环境下&#xff0c;其耐热性能更是备受关注。那么&#xff0c;超宽输送带的耐热性…

解释下泛型擦除

在Java中&#xff0c;泛型擦除&#xff08;Type Erasure&#xff09;是Java泛型实现的一个重要概念。由于Java的泛型是在编译时实现的&#xff08;称为编译时类型检查&#xff09;&#xff0c;而在运行时&#xff0c;Java虚拟机&#xff08;JVM&#xff09;并不支持泛型&#x…

HDFS小文件优化方法

1、HDFS小文件弊端 HDFS上每个文件都要在namenode上建立一个索引&#xff0c;这个索引的大小约为150byte&#xff0c;这样当小文件比较多的时 候 &#xff0c;就会产生很多的索引文件&#xff0c;一方面会大量占用namenode的内存空间 &#xff0c;另一方面就是索引文件过大是的…

Linux —— 线程控制

Linux —— 线程控制 创建多个线程线程的优缺点优点缺点 pthread_self进程和线程的关系pthread_exit 线程等待pthread_ join线程的返回值线程分离pthread_detach 线程取消pthread_cancel pthread_t 的理解 我们今天接着来学习线程&#xff1a; 创建多个线程 我们可以结合以前…

【离散数学】偏序关系中盖住关系的求取及格论中有补格的判定(c语言实现)

实验要求 求n的因子函数 我们将n的因子存入数组中&#xff0c;n的因子就是可以整除n的数&#xff0c;所以我们通过一个for循环来求。返回因子个数。 //求n的因子,返回因子个数 int factors(int arr[], int n) {int j 0;for (int i 1; i < n; i){if (n % i 0){arr[j] i…

C++反向迭代器

C反向迭代器 反向迭代器是用正向迭代器适配实现的&#xff0c;本质是写一个反向迭代器的类模板&#xff0c;给编译器传不同的容器的正向迭代器实例化&#xff0c;编译器去实例化出各种类模板对应的反向迭代器。 #pragma once namespace my_reverse_iterator {template<cla…

代码随想录算法训练营第五十三天| 1143.最长公共子序列,1035.不相交的线,53. 最大子序和

目录 题目链接&#xff1a;1143.最长公共子序列 思路 代码 题目链接&#xff1a; 1035.不相交的线 思路 代码 题目链接&#xff1a; 53. 最大子序和 思路 代码 总结 题目链接&#xff1a;1143.最长公共子序列 思路 ①dp数组&#xff0c;dp[i][j]表示[0,i-1]的text1和…

软件测试面试78问

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、问&#xff1a;你在测试中发现了一个bug&#xff0c;但是开发经理认为这不是一个bug&#xf…

关于使用git拉取gitlab仓库的步骤(解决公钥问题和pytho版本和repo版本不对应的问题)

先获取权限&#xff0c;提交ssh-key 虚拟机连接 GitLab并提交代码_gitlab提交mr-CSDN博客 配置完成上诉步骤之后&#xff0c;执行下列指令进行拉去仓库的内容 sudo apt install repo export PATHpwd/.repo/repo:$PATH python3 "实际路径"/repo init -u ssh://gitxx…