「题解」环形链表的约瑟夫问题

news2024/10/6 20:34:59

文章目录

  • 🍉题目
  • 🍉解析
    • 🍌创建环形链表
    • 🍌释放指定节点
    • 🍌其他思路
  • 🍉写在最后

🍉题目

在这里插入图片描述

🍉解析

题目的意思就是从环形链表的第一个节点开始数,数到第 m 的时候释放对应的节点,然后从下个节点又从1开始数,然后继续释放节点。所以我们要做的就是通过循环不断删除指定位置的节点。比如有5个节点,在删除第二个节点之前,得先让第一个节点的 next 指向第三个。
不过题目现在还没有链表,我们得先来创建一个。

(下面这个图演示有五个节点,m = 2的情况,绿色箭头表示删除某些节点之后剩余节点 next 指针的指向)

在这里插入图片描述

🍌创建环形链表

环形链表和单链表的区别在于,环形它最后一个节点的 next 指向的是第一个节点而非NULL,
既然首尾节点有这种联系,那一开始就得建立这两个指针pheadptail,等下创建链表的时候ptail就在循环中不断往后走,当它走到最后一个节点时,就让该节点的next指向第一个节点。
既然要产生节点,那么先来写个创建节点的函数(前面的文章有讲),代码如下:

ListNode* BuyListNode(int i) {
    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
    node->val = i;
    node->next = NULL;
    return node;
}

接下来要创建链表,这个也不难:

ListNode* CreatListNode(int n) {
    ListNode* phead = BuyListNode(1);
    ListNode* ptail = phead;
    for (int i = 2;i <= n ; i++) {   //注意循环从 i == 2开始
        ListNode* node = BuyListNode(i);
        ptail->next = node;
        ptail = ptail->next; 
    }
    ptail->next = phead;
    return ptail;
}

注意:
①题目有说节点个数可以为1,检查下节点数为1有没有问题,此时首尾节点是同一个,而且不会进入循环,没问题。
②这里返回的是ptail,因为返回它的话我们很容易就能找到phead,而如果返回phead,那要找ptail的话还要遍历链表。

🍌释放指定节点

因为涉及到多次释放节点,不难想到应该要用while循环,那循环终止条件是啥呢?暂时看不出来,先把循环里面的东西写一下再说。

在这里插入图片描述

如上图,调用创建链表函数后,我们用prev接收返回的节点地址(其实就是尾节点),然后定义一个phead(prev->next)作为头指针,再来一个计数器,只要计数器的值为m,就先让prev保存phead的下一个节点,然后删除phead所指节点,然后让phead走向下一节点;若 count 不为m,则让pheadprev都前进一步。下面再画个图方便你理解这个过程。

在这里插入图片描述
在这里插入图片描述

再来说下循环结束条件,按照我刚才上面画的图,按那个走势走下去,最后只剩下节点3,此时pheadphead的next重合了,就可以出循环了,然后返回节点的值。

所以代码如下:

int ysf(int n, int m ) {
    ListNode* prev = CreatListNode(n);
    ListNode* phead = prev->next;
    int count = 1;  
    while (phead->next != phead) {
        
        if(count == m) {
            prev->next = phead->next;
            free(phead);
            phead = prev->next;
            count = 1;   //注意count一定要置为1!
        } else {
            prev = phead;
            phead = phead->next;
            count++;
        }
    }
    return phead->val;
}

整道题的代码如下:

typedef struct ListNode ListNode;

ListNode* BuyListNode(int i) {
    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
    node->val = i;
    node->next = NULL;
    return node;
}

ListNode* CreatListNode(int n) {
    ListNode* phead = BuyListNode(1);
    ListNode* ptail = phead;
    for (int i = 2;i <= n ; i++) {
        ListNode* node = BuyListNode(i);
        ptail->next = node;
        ptail = ptail->next; 
    }
    ptail->next = phead;
    return ptail;
}

int ysf(int n, int m ) {
    ListNode* prev = CreatListNode(n);
    ListNode* phead = prev->next;
    int count = 1;
    while (phead->next != phead) {
        
        if(count == m) {
            prev->next = phead->next;
            free(phead);
            phead = prev->next;
            count = 1;
        } else {
            prev = phead;
            phead = phead->next;
            count++;
        }
    }
    return phead->val;
}

🍌其他思路

在上面演示的例子中,你也可以定义pheadpcur,其中pcur指向第二个节点,不过此时count的初始值要置为2。

🍉写在最后

如果你觉得本文写得还不错的话,那就点个小小的赞和关注喔,你们的支持是我更新的不懈动力!

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

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

相关文章

Arduino、arm、树莓派、单片机四者有什么不同

文章目录 ArduinoARM树莓派单片机 初学单片机的同学&#xff0c;可能会对Arduino、ARM、树莓派以及单片机这些概念比较模糊&#xff0c;实际上&#xff0c;这四个是不同的概念和技术。 Arduino Arduino&#xff08;阿尔杜伊诺&#xff09;是一种开源电子原型平台&#xff0c;它…

Mac安装配置Tomcat,以及使用(详解)

目录 一、Tomcat下载&#xff1a; 1、左栏选择Tomcat版本 2、点击下载即可&#xff0c;任选其一 ​编辑3、下载好的文件夹放到用户名下即可&#xff08;之前已经下载过&#xff0c;这里以Tomcat 8.5.88为演示&#xff09;&#xff0c;这里提供8.5.88的安装包&#xff1a; 二…

Visual Studio 2019下编译OpenCV 4.7 与OpenCV 4.7 contrib

一、环境 使用的环境是Win10,Visual Studio 2019,Cmake3.28,cdua 11.7&#xff0c;cudnn 8.5,如果只是在CPU环境下使用&#xff0c;则不用安装CUDA。要使用GPU处理&#xff0c;安装好CUDA之后&#xff0c;要测试安装的CUDA是否能用。不能正常使用的话&#xff0c;添加一下系统…

LoadRunner使用动态链接库技术

什么是动态库&#xff1f; 动态库一般又叫动态链接库英文为DLL&#xff0c;是Dynamic Link Library 的缩写形式&#xff0c;DLL是一个包含可由多个程序同时使用的代码和数据的库&#xff0c;DLL不是可执行文件。动态链接提供了一种方法&#xff0c;使进程可以调用不属于其可执行…

大数据BigDecimal工具类

我们在开发中经常要对数据进行运算&#xff0c;获取对应正确的数值&#xff0c;而double和float这两个本质都是小数点&#xff0c;没办法使用二进制精确的表示&#xff0c;所以他们是不准确的&#xff0c;这个时候就应该使用大数据BigDecimal进行运算了&#xff0c;它可以精确的…

Selenium自动化测试细节讲解

与以前瀑布式开发模式不同&#xff0c;现在软件测试人员具有使用自动化工具执行测试用例套件的优势&#xff0c;而以前&#xff0c;测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试&#xff0c;而是最大程度地减少手动运行的测试。自动化…

Versal 自适应 SoC SelectMAP 启动检查表

Versal 自适应 SoC SelectMAP 启动检查表 本文档提供了有关 SelectMAP 启动设置的技巧和指南。在提交个案服务请求之前&#xff0c;应认真查看以下检查表。SelectMAP 启动模式的常规检查表&#xff1a; 是否已查看 SelectMAP 文档&#xff0c;了解连接和电源轨的用法&#…

Spring事务一网打尽

Spring事务一网打尽 什么是事务首先说一个坑Spring 中的事务两种用法三大基础设施编程性事务TransactionManager 实现编程性事务TransactionTemplate 实现编程性事务 声明式事务XML配置声明式事务注解配置声明式事务注解XML混合配置声明式事务 什么是事务 这里要额外补充一点&a…

单片机第三季-第五课:GPIO控制LED

目录 1&#xff0c;GPIO数据手册 1.1&#xff0c;端口配置寄存器 ​1.2&#xff0c;端口输入数据寄存器和端口输出数据寄存器 ​1.3&#xff0c;端口位设置/清除寄存器 1.4&#xff0c;端口位清除寄存器 2&#xff0c;原理图分析和MDK工程 3&#xff0c;写代码通过GP…

快速入门:教你如何使用vue-element-admin 集成框架开发项目(保姆式教学)

设置完中文界面&#xff0c;打开是这样的 端口号更改 嘿嘿&#xff0c;要把项目改成自己的&#xff0c;是不是要更改标题啊 题目更改 src/utils/get-page-title.js src/settings.js 如何添加菜单页面 添加菜单页面&#xff08;父菜单/子菜单&#xff09; 效果图 添加自己的页…

Unity--视觉组件(Raw Image,Mask)||Unity--视觉组件(Text,Image)

1.Raw Image 2.mask “”Raw Image&#xff1a;“” Texture&#xff1a;&#xff08;纹理&#xff09; 表示要显示的图像的纹理&#xff1b; Color&#xff1a;&#xff08;颜色&#xff09; 应用于图像的颜色&#xff1b; Material&#xff1a;&#xff08;材质&#xff09…

FreeRTOS源码阅读笔记3--queue.c

消息队列可以应用于发送不定长消息的场合&#xff0c;包括任务与任务间的消息交换&#xff0c;队列是 FreeRTOS 主要的任务间通讯方式&#xff0c;可以在任务与任务间、中断和任务间传送信息&#xff0c;发送到 队列的消息是通过拷贝方式实现的&#xff0c;这意味着队列存储…

前端开发项目中使用字体库

开发中有些项目要求使用固定的字体&#xff0c;这就需要项目中使用字体库。 首先需要下载字体库 将下载的字体文件放进项目中 在项目代码样式文件中定义字体 font-face {font-family: "Tobias-SemiBold";src: url("./assets/font/Tobias-SemiBold.ttf"…

arcgis基础篇--实验

一、绘制带空洞的面要素 方法一&#xff1a;先绘制出一个面区域&#xff0c;然后在面上再绘制一个面区域代表面洞&#xff0c;两者位于同一个图层内&#xff0c;选中代表面洞的区域&#xff0c;选择【编辑器】-【裁剪】工具&#xff0c;将面裁剪出一个洞&#xff0c;随后删除代…

jupyter notebook添加markdown目录

jupyternotebook添加markdown目录 1. 安装python包2. 安装JavaScript和CSS文件3. 启用扩展4. 设置markdown选项 1. 安装python包 官方安装 使用pip pip install jupyter_contrib_nbextensions # 或者 pip install https://github.com/ipython-contrib/jupyter_contrib_nbext…

苹果M3处理器跑分曝光,单核无敌!

10月底&#xff0c;苹果发布了全新的M3、M3 Pro、M3 Max芯片以及搭载M3系列芯片的3款新硬件&#xff0c;包括&#xff1a;新款24英寸iMac、新款14/16英寸MacBook Pro。 根据苹果官方介绍&#xff0c;M3系列芯片基于台积电3纳米工艺打造&#xff0c;采用全新图形处理器架构&…

【操作系统内核】线程

【操作系统内核】线程 为什么需要线程 比如我要做一个视频播放器&#xff0c;就需要实现三个功能&#xff1a; ① 从磁盘读取视频数据 ② 对读取到的视频数据进行解码 ③ 对解码的数据进行播放 如果串行执行&#xff08;通过一个进程来执行&#xff09;&#xff1a; 那么…

视通科技新品发布:4K30分布式编解码一体机,高性价比之选!

随着信息技术的日新月异&#xff0c;各领域对于音视频传输、控制和显示等方面的需求呈现出爆发式的增长。这种需求的增长源于多种因素&#xff0c;包括但不限于高清视频的普及&#xff0c;实时音视频通信的广泛应用&#xff0c;以及各种显示设备的升级换代。 在这样的背景下&a…

动态规划(5)---Leetcode338.比特位计数

题目 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 分析 通常动态规划的做题顺序&#xff0c;先确定dp数组dp[i],然后确定确定递推公式&#xff0c;再dp数…

Gogs安装和部署教程-centos上

0、什么是 Gogs? Gogs 是一款极易搭建的自助 Git 服务。 Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发&#xff0c;并且支持 Go 语言支持的 所有平台&#xff0c;包括 Linux、Mac OS X、Windo…