LeetCode/NowCoder-链表经典算法OJ练习2

最好的,不一定是最合适的;最合适的,才是真正最好的。💓💓💓

目录

 说在前面

题目一:分割链表

题目二:环形链表的约瑟夫问题

SUMUP结尾


 说在前面

 dear朋友们大家好!💖💖💖数据结构的学习离不开刷题,继上次算法OJ练习1,我们继续进行链表经典算法的练习当然除了了LeetCode,有些题也会在NowCoder上,大家可以在这两个网站上进行练习。

 👇👇👇

友友们!🎉🎉🎉点击这里进入力扣leetcode学习🎉🎉🎉
​以下是leetcode题库界面:

 👇👇👇

🎉🎉🎉点击这里进入牛客网NowCoder刷题学习🎉🎉🎉
​以下是NowCoder题库界面:

 

题目一:分割链表

题目链接:面试题 02.04. 分割链表 - 力扣(LeetCode)

题目描述:

 题目分析:

思路:创建大小链表,若pcur节点的值小于x则插入小链表,若pcur节点的值大于x则插入大链表,再将大小链表连接。

注意,实际上小链表的lesstail指向了原链表中数据为5的节点,而大链表的greatertail指向了原链表中数据为2的节点。所以在连接大小链表时,除了将小链表中的lesstail的next指针指向大链表中的第一个有效节点(而非头节点)greaterhead->next,还需要将大链表中的greatertail的next指针置空,否则将形成循环链表。

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* partition(struct ListNode* head, int x) {
    //单独讨论空链表的情况
    if(head==NULL)
    return NULL;  
      //创建大小指针
      ListNode* lesshead=(ListNode*)malloc(sizeof(ListNode));
      ListNode* lesstail=lesshead;
      ListNode* greaterhead=(ListNode*)malloc(sizeof(ListNode));
      ListNode* greatertail=greaterhead;
      ListNode* pcur=head;
      //遍历数组
      while(pcur)
      {
        if(pcur->val<x)//放入小链表
        {
            lesstail->next=pcur;
            lesstail=pcur;
        }
        else//放入大链表
        {
            greatertail->next=pcur;
            greatertail=pcur;
        }
        pcur=pcur->next;
      }
      greatertail->next=NULL;//结尾置NULL
      lesstail->next=greaterhead->next;连接大小链表
      ListNode* ret=lesshead->next;//保存第一个有效节点
      //释放动态申请的空间
      free(lesshead);
      free(greaterhead);
      return ret;
}

 

题目二:环形链表的约瑟夫问题

题目链接:环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com)

背景:著名的约瑟夫问题

据说犹太著名历史学家 Josephus 有过一下的故事:在罗马人占领乔塔帕特后,39个犹太人与Joesphus 及他的朋友躲到一个洞中,39个犹太人决定宁死也不要被人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,知道所有人都自杀身亡为止。

然而 Josephus 和他的朋友并不想遵从,Josephus 要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

题目描述:

 题目分析:

思路:利用count计数,count为m时删除所对应的节点,直到剩下一个节点。

我们以约瑟夫事件原型为例,此时n=5,m=3,我们需要先创建这样一个带环链表,将它封装为函数circle,而创建链表就需要申请节点,将其封装为函数ListBuyNode,同时需要在带环链表中把每个节点的数据设置好,这个行为我们可以用for循环完成。 

创建好链表后,我们需要创建两个指针:pcur用来遍历链表,每每遍历到下一个节点count++,如果遍历的过程中count达到m,就删除这个节点,此时需要将pcur的前一个指针指向pcur的后一个指针,所以我们还需要指针prev来记录pcur的前一个指针,以此往复,直到只剩下一个节点,此时pcur->next指向pcur它自己,所以循环条件就是pcur->next!=pcur。

代码如下:

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @param m int整型 
 * @return int整型
 */
 typedef struct ListNode ListNode;
 //创建节点
 ListNode* ListBuyNode(int x)
 {
    ListNode* node=(ListNode*)malloc(sizeof(ListNode));
    if(node==NULL)
    {
        perror("malloc");
        exit(1);
    }
    node->val=x;
    node->next=NULL;
    return node;
 }
 //创建带环链表
 ListNode* circle(int n)
 {
    ListNode* phead=ListBuyNode(1);
    ListNode* ptail=phead;
    for(int i=2;i<=n;i++)
    {
        ptail->next=ListBuyNode(i);
        ptail=ptail->next;
    }
    ptail->next=phead;
    return ptail;
 }
int ysf(int n, int m) 
{
    //创建关于n的带环链表
    ListNode* prev=circle(n);
    ListNode* pcur=prev->next;
    int count=1;
    while(pcur!=pcur->next)
    {
        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;
}

 约瑟夫问题是循环链表的经典应用,大家重视起来,务必熟练掌握。 

SUMUP结尾

数据结构就像数学题,需要刷题才能对它有感觉。之后还会更新数据结构相关的练习题、面试题,希望大家一起学习,共同进步~

如果大家觉得有帮助,麻烦大家点点赞,如果有错误的地方也欢迎大家指出~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

卷积神经网络边缘识别

为什卷积神经网络能够识别图片呢&#xff1f;是基于图片相似度比较&#xff0c;两张图片的点击越大说明两张图片越像&#xff0c;比如我们那狗胡子的图片去比较&#xff0c;如果相似度很高&#xff0c;就是认为这个动物更像狗。点积越大&#xff0c;图片越相似&#xff0c;这个…

Windows2016系统禁止关闭系统自动更新教程

目录 1.输入cmd--适合系统2016版本2.输入sconfig&#xff0c;然后按回车键3.输入5&#xff0c;然后按回车键4.示例需要设置为手动更新&#xff0c;即输入M&#xff0c;然后按回车键 1.输入cmd–适合系统2016版本 2.输入sconfig&#xff0c;然后按回车键 3.输入5&#xff0c;然后…

揭秘APP广告变现:轻松赚取收益的秘密武器,你还在等什么?

在移动互联网时代&#xff0c;APP广告变现已成为许多开发者和公司获取收益的重要方式。它如同一把秘密武器&#xff0c;帮助那些掌握了其使用技巧的人轻松赚取收益。那么&#xff0c;究竟什么是APP广告变现&#xff1f;又如何通过它轻松赚取收益呢&#xff1f;接下来&#xff0…

对中介者模式的理解

目录 一、场景1、题目 【[来源](https://kamacoder.com/problempage.php?pid1094)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用中介者设计模式1 代码2 问题 三、中介者设计模式1 代码2 更好的例子 四、个人思考 一、场景 设计模式不是银弹&am…

STM32(开篇总结)

STM32介绍 STM32是意法半导体公司基于ARM Cortex-M内核开发的32位微控制器 STM32常应用在嵌入式领域&#xff0c;如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等 STM32功能强大、性能优异片上资源丰富、功耗低&#xff0c;是一款经典的嵌入式微控制器…

Lesson5--二叉树(超详细版)

【本节目标】 1. 树概念及结构 2. 二叉树概念及结构 3. 二叉树顺序结构及实现 4. 二叉树链式结构及实现 1.树概念及结构 1.1树的概念 树是一种 非线性&#xff08;线性结构就是顺序表链表&#xff09; 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个…

超详细比特币Brc-20部署发布:实用步骤演示,请点赞收藏!(一)

大家好&#xff0c;我是程序员大猩猩。 上一节我们讲到如何使用Remix部署智能合约到币安链&#xff0c;如下&#xff1a; 使用Remix部署智能合约到币安链&#xff08;Remix的操作介绍 币安链合约的部署&#xff09; 有很多小伙伴私信问我&#xff0c;那么BTC&#xff08;比特…

linux系统——文件系统挂载原理

linux中从根目录到下面文件&#xff0c;用一套文件系统&#xff0c;当插入外来磁盘&#xff0c;如u盘时&#xff0c;两套文件系统如何进行交互&#xff1f; 挂载即为将一个存储设备连接到另一个已经存在的文件夹中&#xff0c;访问这个文件夹&#xff0c;即为访问该设备存储内容…

如何将 DFMini player MP3 模块与 Arduino 结合使用

要创建此项目&#xff0c;您将使用&#xff1a; DFPlayer迷你MP3模块 10kΩ电阻 开关按钮 面包板 Arduino UNO 杜邦线 现在&#xff0c;我们将学习如何构建该项目。 什么是DF Mini Player MP3模块 DFMini Player 模块是一个小型音乐播放器。它成本低、功耗低&#xff0c;可…

类与对象(二)

封装 封装作为面向对象三大特性&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;之一&#xff0c;那如何实现封装性的呢&#xff1f;就又得拿出上面的访问修饰限定符的图 public: 就是在任何地方都可以访问 protected: 涉及子类在介绍继承时详细介绍 default: …

【深度学习目标检测】二十六、基于深度学习的垃圾检测系统-含数据集、GUI和源码(python,yolov8)

设计垃圾检测系统的意义在于多个方面&#xff0c;这些方面不仅关乎环境保护和城市管理&#xff0c;还涉及到技术进步和社会效益。以下是设计垃圾检测系统的主要意义&#xff1a; 环境保护与资源回收&#xff1a; 垃圾检测系统能够有效地识别不同种类的垃圾&#xff0c;帮助人们…

数据可视化(十二):Pandas太阳黑子数据、图像处理——离散极值、核密度、拟合曲线、奇异值分解等高级操作

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

【JS红宝书学习笔记】第1、2章 初识JS

第1章 什么是JavaScript JavaScript 是一门用来与网页交互的脚本语言&#xff0c;包含以下三个组成部分。 ECMAScript&#xff1a;由 ECMA-262 定义并提供核心功能。文档对象模型&#xff08;DOM&#xff09;&#xff1a;提供与网页内容交互的方法和接口。浏览器对象模型&…

LeetCode 98. 验证二叉搜索树

LeetCode 98. 验证二叉搜索树 1、题目 题目链接&#xff1a;98. 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节…

使用apache和htaccess对目录访问设置密码保护配置教程

对目录设置密码保护配置说明 我们有时候访问某些网站的时候&#xff0c;要求输入用户名和密码才能访问。这是为了保护隐私&#xff0c;只让经过许可的人访问。 在本教程中主要介绍两种方法&#xff0c;一种是通过apache httpd.conf配置文件对管理后台目录设置密码保护&#xff…

LeetCode 700.二叉搜索树中的搜索

LeetCode 700.二叉搜索树中的搜索 1、题目 题目链接&#xff1a;700. 二叉搜索树中的搜索 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则…

Docker入门指南:Docker容器的使用(三)

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 在本章节中&#xff0c;将深入探讨 Docker 容器的概念&#xff0c;以及容器的使用。 &#x1f4d6; 正文 1 什么是容器 1.1 Docker容器的介绍 Docker 容…

使用Gin编写Web API项目并自动化文档

最近需要使用Go写一个Web API项目&#xff0c;可以使用Beego与Gin来写此类项目&#xff0c;前文使用Beego创建API项目并自动化文档介绍了使用Beego来创建的Web API项目并自动化文档的方法。本文就介绍一下使用Gin来编写Web API项目并自动化文档。 一、创建项目 在创建Beego项…

栈与队列OJ题【括号适配问题】【用队列实现栈】【用栈实现队列】【设计循环队列】

一.有效的括号 ​​​OJ链接 这一道题我们就可以用栈来解决&#xff1a; 不了解栈的可以看我的上一篇博客。 typedef char STDataType; //用数组来实现栈 typedef struct stack {STDataType* a;int capacity;int top; }ST; void STInit(ST* pst) {assert(pst);pst->a NU…

基于SSM的理发店会员管理系统的设计和实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的理发店会员管理系统的设计和实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0…