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

环形链表的约瑟夫问题

这道题思路如下:

1.首先按照题目要求,要创建一个链表

2.要把链表头尾向连,形成带环链表

3.遍历链表,建立一个指针pcur指向当前节点,再建立一个指针prev指向pcur指的节点的前一个节点,当要删除pcur的时候,只需要让prev->next = pcur->next,这样子就跳过了pcur,再将pcur给free掉就好了,如此循环,最后只剩一个值

1.先来创建链表

首先重命名一下,方便表达:

接着就要创建链表了,但是我们还没有节点,所以先要自己写一个函数buynode(),用于创立节点,使用malloc开辟节点,然后检查是否开辟成功,如果成功就给节点传数据,代码如下:

创建完节点以后,就可以来创建链表了:

1.创建一个指针phead指向头结点,创建一个尾指针ptail,用ptail遍历数组,最后将ptail的next指针指向头结点,实现环形链表:

2.前置准备完毕,开始做题,首先我们需要两个指针,一个prev,一个pcur;pcur指向头结点,prev指向pcur的前一个节点,由于现在已经是环形链表,所以prev指向的就是尾节点,接着给一个count来数数:

接下来写一个循环,每次都count++,那如果count达到了题目限制的m,就删那个pcur,并且在free之前,要记得先把prev和pcur->next连起来,如果count没有达到限制的m,就正常往后走。

这样子循环的话,n的值会越来越小,那知道达到这个链表只有一个节点的时候,才符合题意,也就是while(pcur!=pcur->next),代码如下:

最后按照题意,返回val:

整体代码如下:

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整型 * @param m int整型 * @return int整型*/
typedef struct ListNode LSTNode;//重命名方便表示
//创建节点
LSTNode* buynode(int x)
{//先用malloc开辟一块空间LSTNode* node=(LSTNode*)malloc(sizeof(LSTNode));if(node==NULL)//判断一下有没有开辟成功{exit(1);}node->val = x;//给新开辟的节点赋值node->next = NULL;return node;//返回节点a
}
//创建带环链表
LSTNode* createcircle(int n)
{//先创建头结点和尾节点LSTNode *phead = buynode(1);//用buynode函数LSTNode *ptail = phead;for(int i = 2 ; i <= n ; i++){ptail->next=buynode(i);ptail=ptail->next;}ptail->next = phead;return ptail;
}
int ysf(int n, int m ) {// write code here//根据n创建带环链表LSTNode* prev = createcircle(n);//头结点的前一个节点的指针LSTNode* pcur = prev->next;//指向头结点的指针int count=1;//计数while(pcur->next != pcur)//当链表只有pcur自己一个节点的时候,跳出循环{if(count == m)//到达规定的数字,删除这个节点{prev->next = pcur->next;//跳过pcurfree(pcur);//将pcur的节点删掉pcur = prev->next;//pcur向前移动count = 1;//count重新变为1}else{//此时不需要销毁节点prev = pcur;pcur = pcur->next;count++;}}//此时只剩下一个节点return pcur->val;
}

http://www.xdnf.cn/news/223345.html

相关文章:

  • 从生成到上线:飞算JavaAl工程化能力拆解(含K8s部署脚本自动生成)
  • STM32printf重定向到串口含armcc和gcc两种方案
  • 高并发内存池(五):性能测试与性能优化
  • Java实现归并排序算法
  • 《机器学习中的过拟合与模型复杂性:理解与应对策略》
  • 量化交易之数学与统计学基础2.3——线性代数与矩阵运算 | 线性方程组
  • windows 下 oracle 数据库的备份与还原
  • SQL Server连接异常 证书链是由不受信任的颁发机构颁发的
  • 垃圾收集GC的基本理解
  • 服务容错治理框架resilience4jsentinel基础应用---微服务的限流/熔断/降级解决方案
  • 通过IP计算分析归属地
  • 知识图谱系列(1):基础概念与发展历程
  • ubuntu22.04出现VFS: Unable to mount root fs on unknown-block(0,0)
  • 网络规划和设计
  • ceph存储原理
  • 人格伤疤测试:发现内心深处的情感创伤
  • 【今日三题】kotori和气球(排列) / 走迷宫(BFS最短路) / 主持人调度(二)(贪心+优先级队列)
  • 服务端字符过滤 与 SQL PDO防注入
  • [C语言]猜数字游戏
  • 软件系统容量管理:反模式剖析与模式应用
  • 什么是环境变量,main函数的命令行参数的概念和作用,以及进程地址空间详解
  • antd中的表格穿梭框(Transfer)如何使用
  • 类和对象 (拷贝构造函数和运算符重载)上
  • MySQL学习总结
  • 华锐视点历经十八年沉淀所形成的产品特性
  • 【AI平台】n8n入门4:n8n云创建工作流(无须搭建,快速试用14天)
  • TypeScript 全局类型声明文件规范性分析与归纳
  • 赛事季突围!备战2025全国信息素养大赛 python挑战赛~
  • JavaScript 相关知识点整理
  • 【LLM】Qwen3模型训练和推理