【每日易题】数据结构链表篇——单链表oj题(1),几道典型例题带你快速掌握单链表

在这里插入图片描述

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发

Hello,米娜桑们,这里是君兮_,今天来填一个埋了好久的坑,在暑假之前就预告过这个系列,但由于各种原因(主要是有点懒)今天才开坑。我们这个系列主要是根据博主自身的编程学习的经历来带大家分模块来刷一些经典的题型,通过做题来加深大家对该部分内容的掌握。
好了,废话不多说,开始今天的学习吧!

  • 我们的刷题顺序是从入门到入土,其中前面入门的内容与后面入土的内容有些还有一定的联系,能直接帮助你入土哦!!!(好了,不开玩笑,只要你好好琢磨琢磨这些题你都能独立完成的)

一.移除链表元素

  • 本题oj链接如下:移除链表元素
    在这里插入图片描述
  • 其中关于题目的文字描述并不难理解,通过结合给的示例我们知道本题想要删除链表中所有等于val的值,返回把剩下节点连在一起的头节点。
  • 下面提供改题目的解答思路以及代码实现
  • 1.该题其实与我们之前讲的单链表的中间删除非常相似,只不过我们的中间删除是通过地址来找到需要删除的位置,而本题需要的找到节点中等于val的值删除,我们只需要让等于val的节点的前一个节点跳过值等于val的节点指向val下一个节点,最后再把等于val的节点free释放掉即可
struct ListNode* removeElements(struct ListNode* head, int val) {
    if(head == NULL)//链表中什么都没有
        return NULL;
    
    struct ListNode* cur = head;
    struct ListNode* prev = NULL;
    
    while(cur)
    {
        //如果当前节点是需要删除的节点
        if(cur->val == val)
        {
            //首先保存下一个节点
            struct ListNode* next = cur->next;
            //如果删除的为头节点,更新头节点
            //否则让当前节点的前趋节点链接next节点
            if(prev == NULL)
            {
                head = cur->next;
            }
            else
            {
                prev->next = cur->next;  
            }
            //释放当前节点,让cur指向next
            free(cur);
            cur = next;
        }
        else
        {
            //如果cur不是需要删除的节点,则更新prev,cur
            prev = cur;
            cur = cur->next;
        }
    }
    
    return head;//返回新头
}

在这里插入图片描述


二.反转链表

  • 本题oj链接如下:反转链表
    在这里插入图片描述

  • 该题有两种思路,我们分别来介绍一下,并代码实现

  • 1.链表中有一种插入方式叫头插,顾名思义就是在头部进行节点的插入,比如你在链表中依次头插 1 2 3 4 5,那么其实在链表中其实是反过来依次从头插的,也就是 5 4 3 2 1.这与我们这题想要我们实现的反转链表不就对上了吗?

struct ListNode* reverseList(struct ListNode* head){
    //把原链表中的节点依次头插入新链表中
    struct ListNode*newnode=NULL;
    struct ListNode*cur1=head;
    while(cur1)
    {
        //头插 
      struct ListNode*next=cur1->next;
           
            cur1->next=newnode;
            newnode=cur1;
            cur1=next;
        
    }
    return newnode;
   
}

在这里插入图片描述

  • 2.通过三个指针倒转该链表,我们假设此时有三个指针,其中n1指向head,n2指向n1的next,n3指向n2的next,此时逻辑图如图所示。
    在这里插入图片描述
  • 我们想要该链表反转,我们可以让链接两个节点的箭头转向,用c语言的话来说,就是让该节点的指针从指向下一个节点变为指向上一个节点,由于此时的1变为了新的尾,我们把1的next置空,如图`
    在这里插入图片描述
  • 当我们完成这一步后,下面我们需要把三个指针都往前走一步,让链表中未反转的节点也反转一下

在这里插入图片描述

  • 我们的结束条件是什么呢?当我们的n1是最后一个节点时,说明我们链表中所有的节点都已经反转完成,此时是不是就可以停了?此时由于n2为的前一位,也就是n2为空时,n1就来到了我们的最后一位,因此我们可以把n2为空作为循环停止的条件

在这里插入图片描述

struct ListNode* reverseList(struct ListNode* head) {
    if(head == NULL || head->next == NULL)//说明此时只有一个节点或者没有节点,直接返回head即可
        return head;
    
    struct ListNode* n1, *n2, *n3;
    n1 = head;
    n2 = n1->next;
    n3 = n2->next;
    n1->next = NULL;
    //中间节点不为空,继续修改指向
    while(n2)
    {
        //中间节点指向反转
        n2->next = n1;
        //更新三个连续的节点
        n1 = n2;
        n2 = n3;
        if(n3)//防止n3越界,判断一下n3是否为空
            n3 = n3->next;
    }
    //返回新的头
    return n1;
}

在这里插入图片描述

3.链表的中间结点

  • oj链接如下:链表的中间结点
    在这里插入图片描述
  • 这个oj题同样有两种解法,我们还是来一种一种的分析
  • 1.暴力求解法
  • 题目要求的是找到链表的中间结点,那么我们首先可以先遍历一遍链表同时计数,以此达到记录链表中有多少结点的目标,之后我们在取计数的一半,让链表遍历一半,此时的结点就是我们的中间结点啦!
struct ListNode* middleNode(struct ListNode* head){
     
        struct ListNode*cur=head;
        struct ListNode*midcur=head;
        int size=0;//标记计数
        while(cur)
        {
            size++;
            cur=cur->next;
        }
        int len=size/2;//取链表节点数的一半找到中间结点
        while(len)
        {
            midcur=midcur->next;
            len--;
        }
        return midcur;
}

在这里插入图片描述

  • 第二种方法就比较巧妙了,我们现在来通过一个实际的例子来帮助大家理解。
  • 某天,一个老和尚测试一个小和尚几个问题,并要求他在半炷香内回答出来,此时老和尚委托你来负责计时,但是由于寺庙里香不够了,只有一炷香供你计时,那么此时你应该怎么做呢?
  • 答案是:从两头同时开始烧
  • 这个实际的例子有没有带给你什么启发呢?我们同样是需要求链表的中间结点,也就是一半。
  • 揭晓答案:使用快慢指针,快的一次走两步,慢的一次走一步,当快的走到尾时,慢的指针此时就在中间结点。
  • 类比一下,此时快指针就是从两头烧,慢指针是从一头烧,当两头烧完时,就相当于一头烧烧完了半炷香!!
struct ListNode* middleNode(struct ListNode* head){
     
       struct ListNode*fast,*slow;
        fast=slow=head;
        while(fast&&fast->next)
        {
            fast=fast->next->next;
            slow=slow->next;
        }
        return slow;
}

在这里插入图片描述


总结

  • 今天的内容到这里就结束了,一次讲多了大家可能会贪多嚼不烂,所以暂时先介绍这三个典型的题,之后也会继续更新有关的其他题目。切记如果你想要真正学好的话一定要自己动手试试哦,光看不自己写是永远学不会的!!

  • 好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

在这里插入图片描述

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

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

相关文章

Scratch 之 如何制作简单的碰撞箱

hello,大家好,今天教给大家如何制作粗糙的碰撞箱 本次教学不用拓展、不用自制积木、不用变量、不用列表 首先明确原理 图1 我们想做到第一个 而大家不要做成第二个 错误示范: 然后就变成了 咳咳咳 这就是我们不想看到的 于是你可以这样…

ESP32-C2开发板 ESP8684芯片 兼容ESP32-C3开发

C2是一个芯片采用4毫米x 4毫米封装,与272 kB内存。它运行框架,例如ESP-Jumpstart和ESP造雨者,同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统,受到了全球用户的信赖。它由支持Espressif以及所有…

文心一言 VS 讯飞星火 VS chatgpt (71)-- 算法导论7.1 1题

参照图 7-1的方法,说明 PARTITION在数组 A(13,19,9,5,12,8,7,4,21,2,6,11)上的操作过程。 文心一言: PARTITION 是一种常…

【ASP.NET MVC】使用动软(一)(9)

一、解决的问题 前文为解决数据库操作设计的 TestMysql 类,仅简单地封装了一个Query函数,代码如下: public class TestMysql{public static string SqlserverConnectStr "server127.0.0.1;charsetutf8;user idroot;persistsecurityin…

问题解决方案

前端开发 1、npm安装的时候老是卡住 reify:rxjs: timing reifyNode:node_modules/vue/cli/node_modules 查看当前使用的那个镜像 nrm lsnpm ---------- https://registry.npmjs.org/yarn --------- https://registry.yarnpkg.com/cnpm --------- https://r.cnpmjs.org/taobao …

第四次作业

1. 简述静态网页和动态网页的区别。 静态页面:请求响应信息,发给客户端进行处理,由浏览器进行解析,显示的页面。在网站设计中,纯粹HTML格式的网页(可以包含图片、视频JS (前端功能实现)、CSS (…

从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口测试是对系统…

数据集相关网站(Open datasets and sources)

数据集相关网站(Open datasets and sources) 数据集网站 Open datasets and sources政府数据网站 Government Data:金融数据网站 Financial Data Sources:犯罪数据网站 Crime Data:健康数据网站 Health Data:学术和商业数据网站 Academic and Business Data:其他数据…

服务器流量

1.服务器流量分为入流量和出流量 入流量(Inbound Traffic)是指流向服务器的数据流量,也就是客户端发送到服务器的数据。这些数据可能包括请求信息、文件上传等。 出流量(Outbound Traffic)是指从服务器流向客户端的数…

【数据分析】numpy (二)

numpy作为数据分析,深度学习常用的库,本篇博客我们来介绍numpy的一些进阶用法: 一,numpy的常用简单内置函数: 1.1求和: a np.array([[1, 2],[3, 4]]) np.sum(a)10 1.2求平均值: np.mean(a…

“Why Should I Trust You?” Explaining the Predictions of Any Classifier阅读笔记

“Why Should I Trust You?” Explaining the Predictions of Any Classifier阅读笔记 1. 论文贡献2. 背景 [ 1 ] ^{[1]} [1]3. LIME解释单个样本3.1 总体思想3.2 构建可解释的数据表示 [ 1 ] ^{[1]} [1]3.3 可解释性和忠实度的权衡3.4 局部采样3.5 稀疏线性解释3.6 使用SVM进…

C语言进阶第一课 -----------深度剖析数据在内存中的存储

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂…

组合总和 II——力扣40

文章目录 题目描述法一 回溯 题目描述 法一 回溯 class Solution{ public:vector<pair<int, int>>freq;vector<vector<int>> res;vector<int> seq;void dfs(int pos, int rest){//如果目标值为0&#xff0c;说明可能有一个组合或者rest本身为0 …

基于Java+SpringBoot+Vue的就业信息管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

redis 集群 1:李代桃僵 —— Sentinel

目前我们讲的 Redis 还只是主从方案&#xff0c;最终一致性。读者们可思考过&#xff0c;如果主节点凌晨 3 点突发宕机怎么办&#xff1f;就坐等运维从床上爬起来&#xff0c;然后手工进行从主切换&#xff0c;再通知所有的程序把地址统统改一遍重新上线么&#xff1f;毫无疑问…

C语言第十三课--------初阶指针的认识--------重要部分

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

Hadoop 之 Hive 4.0.0-alpha-2 搭建(八)

Hadoop 之 Hive 搭建与使用 一.Hive 简介二.Hive 搭建1.下载2.安装1.解压并配置 HIVE2.修改 hive-site.xml3.修改 hadoop 的 core-site.xml4.启动 三.Hive 测试1.基础测试2.建库建表3.Java 连接测试1.Pom依赖2.Yarm 配置文件3.启动类4.配置类5.测试类 一.Hive 简介 Hive 是基于…

Nginx的搭建与核心配置

一、Nginx 1、Nginx概述 一款高新能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 2、Nginx主要功能&#xff1a; 静态文件服务&#xff1a;nginx可直接提供静态文件服务&#xff0c;HTML、CSS、J…

STM32CubeMX+VSCODE+EIDE+RT-THREAD 工程创建

Eide环境搭建暂且不表&#xff0c;后续补充。主要记录下Vscode环境下 创建Rt-thread工程的过程。分别介绍STM32CubeMX添加rtt支持包的方式和手动添加rtt kernel方式。STM32CubeMX生成工程的时候有"坑"&#xff0c;防止下次忘记&#xff0c;方便渡一下有缘人&#xff…

maven发布到中央仓库

创建账号 https://issues.sonatype.org 【第二步】登录申请新项目 右上角点击Create&#xff0c;Project选择第一项&#xff0c;有的时候带不出来第二个New Project&#xff0c;可以再选一次Project的选项。
最新文章