链表常见OJ题汇总(持续更新)

news2025/1/11 19:46:23

目录

    • 前言
    • 一、移除链表中的元素(多指针法)
    • 二、反转链表(多指针法&头插法)
    • 三、链表的中间结点(算数法和双指针法)
    • 四、链表中的第K个结点(算数法&双指针法)
    • 五、合并两个有序链表(尾插法)
    • 六、链表分割(尾插法)
    • 七、链表的回文结构
    • 八、链表相交
    • 九、环形链表(一)
    • 十、环形链表(二)
    • 十一、复杂链表的复制:复制带随机指针的链表

前言

本文主要总结博主平时做过的链表的常见OJ题,持续更新~

一、移除链表中的元素(多指针法)

  1. 题目
    在这里插入图片描述
  2. 提交代码:
    在这里插入图片描述
  3. 提交结果:
    在这里插入图片描述
  4. 思路分析:
    本题主要是使用了三个指针来记录链表中的相邻三个结点,其中使用cur指针从头遍历到尾,使用prev指针随时记录cur的前一个结点,使用next随时记录cur的下一个结点。需要注意:当cur指针指向链表的第一个结点的时候,此时cur没有前一个结点,因此prev刚开始为空。在遍历的过程中,就是在不断比较cur指向的结点的值与题目给定的值是否相等,在这里就会分为两种情况,显然是cur指向的结点的值和题目给定的值是相等的,cur指向的结点的值与题目给定的值不相等。
  5. 当cur指向的结点的值与题目给定的值不相等的时候,此时只需要让cur指针向后走,prev同步向后走即可,这里有一个细节,在cur向后走之前一定要先将cur的值更新到prev中,否则后续prev就无法更新了。
  6. 当cur指向的结点的值与题目给定的值相等的时候,此时需要将cur指向的结点删除,这里又分为两种情况:prev是否为空,即删除的结点是否为第一个结点
  • 当prev == NULL:此时删除的是链表中的第一个结点,在这里需要做的事情是删除第一个结点,更新头指针指向的结点到下一个结点,同时也让cur走向下一个结点,更新next,再更新next的时候一定需要注意此时cur是否为空,如果cur已经为空了,那么就不需要再更新Next了,这种情况发生在:更新cur前,cur已经指向链表的最后一个结点,那么此时Next指针就已经为空,此时更新cur指针的话,cur就为空了,所以此时不能再更新next指针,如果再更新next指针,就会在代码next - cur->next;中出现cur为空指针的情况继续访问空指针,处理方法就是由于注意到cur可能走向空,所以,再更新next指针之前需要判断cur指针是否为空
  • 当prev!=NULL的时候:说明此时删除的结点不是第一个结点,那么此时需要做的事情就是删除cur指向的结点(free(cur);),让cur前后指向建立练习(prev->next = next;),再更新cur和next,再更新next的时候同样需要注意cur为空的情况需要额外进行判断

二、反转链表(多指针法&头插法)

  1. 题目:
    在这里插入图片描述
  2. 多指针法
  • 提交代码:
    在这里插入图片描述
  • 提交结果:
    在这里插入图片描述
  • 思路分析:
    本题采用三个指针来解决链表的反转问题,使用cur指针从头到尾遍历链表的每一个结点,使用prev指针随时记录cur指向的结点的前一个结点,使用next指针随时记录cur指针指向的结点的下一个结点,刚开始,当cur指向链表的第一个结点的时候,此时cur指向的结点没有前一个结点,此时prev = NULL;再从头遍历到尾的过程中,我们会发现,我们只需要将cur指向前一个结点,依次到尾,就会发现链表就被反转了,迭代的过程,先保存cur结点的下一个结点,然后先将cur的值更新给prev,再更新cur为next,更新cur的时候同样需要注意cur的值是否为空,当最后依次遍历的时候,也就是遍历链表的最后一个结点的时候,更新cur的时候cur就被更新为空指针了,此时就不需要再更新next了,处理方法同样是在更新next前先判断cur的值是否已经是空指针,若是,则不需要继续更新,若不是,则再继续更新next
  1. 头插法(构造新链表)
    提交代码
    在这里插入图片描述
  • 提交结果
    在这里插入图片描述
  • 思路分析:
    本题也可以通过构造一个新链表采用头插法来解决:具体为构造一个新链表的头指针newHead,刚开始为空,使用一个cur指针遍历原来链表,使用next指针随时记录cur指针指向的结点的下一个结点随时准备更新cur,让cur指向新链表的头newHead,这样就可以不断将原链表的结点一个个连接到新链表,从而完成原链表的反转,再更新next的时候同样需要注意cur为空的情况,当遍历到原链表的最后一个结点的时候,此时next指向空,再更新cur,cur也指向了空,此时就不需要继续更新next了。

三、链表的中间结点(算数法和双指针法)

  1. 题目:
    在这里插入图片描述
  2. 算数法
  • 提交代码:
    在这里插入图片描述

  • 提交结果:
    在这里插入图片描述

  • 思路分析:
    通过先计算出链表中的结点个数,再计算链表的中间结点数,通过对链表的结点个数是奇数还是偶数进行分类讨论,从而确定返回的是哪个结点作为中间结点,注意在计算链表结点个数时,count变量应该从0开始进行计算,而不能从1开始,如果从1开始,就会导致计算出的结点个数多1,因为再遍历的过程中我们是控制遍历到空的,所以上面是一种方法:count从0开始,遍历到空,也可以:count从1开始,遍历到最后一个结点。上面的两种方法的控制就是在遍历中的循环条件不同而已。对链表结点个数进行分类讨论的过程中有两种情况:链表结点个数为奇数,链表结点个数为偶数

  • 当链表结点个数为奇数时:此时只有一个中间结点,先求出中间结点数mid,然后使用循环条件–mid进行控制即可,cur从头开始的情况

  • 当链表结点个数为偶数时:此时链表存在两个中间结点,根据题目要求,我们需要返回的是第二个中间结点,此时求出中间结点数之后,使用循环条件mid–进行控制即可,cur从头开始的情况

    1. 双指针法
  • 提交代码:
    在这里插入图片描述

  • 提交结果:
    在这里插入图片描述

  • 思路分析:
    本题采用快慢指针(双指针)的方法来解决求中间结点的问题,通过中间结点大概是总结点数的两倍的关系采用快指针一次走两步,慢指针一次走一步,慢指针最终记录的就是我们所要的中间结点,这个题同样需要对结点的个数进行分类讨论,当结点个数为奇数的时候,快指针走到最后一个结点的时候,此时慢指针记录的就是中间结点,当结点个数为偶数时,链表同样存在两个中间结点,当快指针走到空的时候,此时慢指针记录的就是我们想要的中间结点,需要注意的是while(fast&&fast->next)这个循环条件中fast和fast->next的位置不能颠倒

四、链表中的第K个结点(算数法&双指针法)

题目:
在这里插入图片描述

  1. 算数法
    提交代码
    在这里插入图片描述
    提交结果:
    在这里插入图片描述
    VS上测试分析
    在这里插入图片描述
    思路分析:
    算数法是通过求出链表总的结点个数,再算倒数第K个结点,比如:cur从头开始,一共有5个结点,倒数第1个结点其实就是第5个结点,倒数第2个结点就是第4个结点,倒数第3个结点就是第3个结点,倒数第4个结点就是第2个结点,倒数第5个结点就是第1个结点,循环的次数,当k = 1时循环4(5-1)次找到第5个结点,当k = 2时,循环3(5-2)次找到第4个结点…,当链表中结点个数为count时,cur从头开始,找倒数第k个结点需要循环(count-k)次

五、合并两个有序链表(尾插法)

题目:
在这里插入图片描述

六、链表分割(尾插法)

题目:
在这里插入图片描述

七、链表的回文结构

题目:
在这里插入图片描述

八、链表相交

题目:
在这里插入图片描述

九、环形链表(一)

题目:
在这里插入图片描述

十、环形链表(二)

在这里插入图片描述

十一、复杂链表的复制:复制带随机指针的链表

题目:
在这里插入图片描述

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

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

相关文章

vue 父子组件设置 scoped, 如何导致滚动条失效的

vue父组件的页面结构 // 调用子组件 <process-time-line :nodeArr"nodeArr"></process-time-line> 父组件的样式 <style lang"scss" scoped> ::-webkit-scrollbar {width: 0px;height: 0px;} </style>子组件的页面结构 <div …

学习C语言笔记:字符串和格式化输入/输出

学习内容&#xff1a;1.函数——strlen()&#xff1b;2.关键字——const&#xff1b;3.字符串&#xff1b;4..如何创建、存储字符串&#xff1b;5.如何使用strlen()函数获取字符串的长度&#xff1b;6.用C预处理器指令#define和ANSIC的const修饰符创建符号常量。与程序交互和使…

《Linux运维实战:Centos7.6基于docker-compose一键离线部署redis6.2.8之哨兵集群》

一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&#xff0c;而作为基础组件中的redis针对不同的客户环境需要多次部署哨兵集群&#xff0c;作为一个运维工程师&#xff0c;提升工作效率也是工作中的重要一环。所以我觉得有必要针对re…

(Java高级教程)第三章Java网络编程-第一节3:网络编程必备网络知识3之IP地址、端口号

文章目录一&#xff1a;网络传输基本流程&#xff08;1&#xff09;数据包&#xff08;2&#xff09;网络传输的基本流程&#xff08;3&#xff09;具体处理过程A&#xff1a;发送数据B&#xff1a;路由转发C&#xff1a;接受数据二&#xff1a;网络中的地址&#xff08;1&…

Elasticsearch-使用入门

_cat /_cat/nodes&#xff1a;查看所有节点 接口&#xff1a;GET http://192.168.177.134:9200/_cat/nodes /_cat/health&#xff1a;查看ES健康状况 接口&#xff1a;GET http://192.168.177.134:9200/_cat/health /_cat/master&#xff1a;查看主节点信息 接口&#xff1a;G…

【Azure 架构师学习笔记】-Azure Logic Apps(3)-演示1

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Logic Apps】系列。 接上文【Azure 架构师学习笔记】-Azure Logic Apps&#xff08;2&#xff09;-组件介绍 前言 前面两篇文章大概介绍了一些理论知识&#xff0c;但是为用而学才是最重要的&#xff0c;所以接下来做…

word排版时如何保证每张图片大小一样?

问题描述 为了保证文档的美观性&#xff0c;在对图片进行排版时&#xff0c;最好保证图片的大小一致&#xff0c;尤其是多张图片组成一张大图时。 如果一张张图片调整大小&#xff0c;那真的是毫无技术含量的耗时工作。 解决方案 在这提出一种借助表格的解决办法。比如有4张…

Parasoft发布最广泛的MISRA规则覆盖-C/C++test最新版本正式上线!

作为拥有30多年自动化软件测试经验的全球领导者Parasoft宣布发布Parasoft C/Ctest的最新2022.2版本&#xff0c;支持MISRA C:2012修正案3和MISRA C 202x的草案版本。Parasoft针对C和C软件开发的统一、完全集成的测试解决方案的最新版本&#xff0c;帮助团队实现自动化静态分析和…

【java入门系列三】java基础-控制结构

学习记录&#x1f914;分支控制if-elseswitch分支接收字符for循环控制while循环do-while打印金字塔break终止-可以用label&#xff1a;表明continue与break类似return循环中表示直接退出方法(函数)&#xff0c;主方法直接结束字符串比较trick讨论总结谢谢点赞交流&#xff01;(…

外观模式

外观模式 1.外观模式介绍 1.外观模式&#xff08;Facade&#xff09;&#xff0c;也叫“过程模式&#xff1a;外观模式为子系统中的一组接口提供一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用 2.外观模式通过定义一个一…

Linux(06)之获取内核代码

Linux(06)之获取内核代码 Author&#xff1a;OnceDay Date&#xff1a;2023年1月5日 漫漫长路&#xff0c;有人对你微笑过嘛… 参考文档&#xff1a; 《Linux内核设计和实现》 1.概述 linux内核的基本架构如下&#xff1a; 所以每个处理器运行的地方只有以下可能&#xf…

带你玩转指针——指针进阶(二)

上次我们说到了函数指针&#xff0c;对于函数指针大家还不太清楚的参考&#xff0c;指针进阶&#xff08;一&#xff09;http://t.csdn.cn/z5cjM函数指针数组数组是存放相同类型的空间&#xff0c;前面我们已经学习了指针数组int* arr[10] 每个元素是int*那么我们把函数的地址存…

grpc实现c++异步非阻塞stream

grpc实现c异步非阻塞stream 参考文章 Non-blocking single-threaded streaming C servergRPC C async api doc and sample codegrpc异步stream server端demo 序言 原来一直是用着同步阻塞的grpc stream。由于不想再创建新的线程来监听grpc stream的新消息了&#xff0c;所以就…

怎么提高程序设计能力?可以参考程序-设计原则,程序-设计模式

怎么提高程序设计能力&#xff1f; 简单说下我的方式方法&#xff1a; 【程序架构】 借鉴设计模式和设计原则 【程序业务】 多理解客户需求&#xff0c;理解后&#xff0c;做竞品逻辑分析&#xff0c;分析出其逻辑结构&#xff0c;和数据结构 &#xff1b; 再根据客户需求…

自己有工厂,怎样接外贸订单?

很多做外贸的小工厂和小型加工厂&#xff0c;除了传统的营销渠道外&#xff0c;也不知道如何做、才能接到外贸订单。小工厂想获得外贸订单&#xff0c;可通过以下7个方法&#xff1a;1、注册一些外贸B2B平台&#xff0c;发布产品&#xff0c;等待客户询盘外贸B2B平台太多了&…

商务车改装之奔驰威霆改装

今天来看看这台车的改装效果&#xff0c;首先外观改成GLS的一个包围。同时大灯换了一个三道杠的运动大灯。运动大灯加上包围&#xff0c;是不是时尚了很多。再来看看威霆内饰&#xff0c;白红相间的色彩搭配&#xff0c;仪表台换成一个大连屏的仪表台&#xff0c;带着飞机一样的…

4路DI开关检测计数器NPN/PNP输入,Modbus TCP协议,WiFi模块YL160频率测量 计数器

特点&#xff1a;● 4路开关量输入&#xff0c;支持NPN和PNP输入● DI每一路都可用作计数器或者频率测量● 支持Modbus TCP 通讯协议● 可以设置每转脉冲数用于转速测量● 内置网页功能&#xff0c;可以通过网页查询电平状态● 可以通过网页设定输出状态● 宽电源供电范围&…

OPC Expert v8.1.2211 Crack

像专业人士一样解决您的 OPC 和 DCOM 连接问题 [无需经验] 快速修复 OPC 和 DCOM 错误 使用 OPC Expert&#xff0c;您无需任何经验即可解决和修复 OPC 连接问题。OPC Expert 为您完成繁重的工作&#xff0c;以快速自动诊断 OPC 和 DCOM 问题……Ω578867473而且还不止于此。OP…

基于Java+SpringBoot+vue+element实现餐厅点餐系统平台

基于JavaSpringBootvueelement实现餐厅点餐系统平台 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录基于JavaSpringBo…

ATGM336H-5N定位导航模块介绍

ATGM336H-5N定位导航模块简介ATGM336H-5N系列模块是9.7X10.1尺寸的高性能BDS/GNSS全星座定位导航模块系列的总称。该系列模块产品都是基于中科微第四代低功耗GNSSSOC 单芯片—AT6558&#xff0c;支持多种卫星导航系统&#xff0c;包括中国的BDS&#xff08;北斗卫星导航系统&am…