单链表经典算法题

news2025/2/23 1:32:09

一:反转链表:

  206. 反转链表 - 力扣(LeetCode)

思路一:就是创建一个新的链表,然后将原链表的节点拿过来头插:

首先创建一个新的链表(带头链表)(哨兵位)然后每次在每次循环旧链表时,创建一个新的节点,将旧链表中存储的值给新的节点,再让新的节点头插到新的链表中即可。

创建如图所示的所需要的内容:

这个就是这个思路的准备工作。

现在开始循环旧链表,将旧链表的值赋给每次循环创建的新节点。

这就是循环里的一次过程。

接下来就是整个循环的代码:

整个代码如图:

在这里即使旧链表为空,这个代码也符合,当旧链表为空时,不会进入这个循环,所以创建的新链表也为空,此时返回新链表的第一个有效节点即为空。

思路二:创建三个指针,来完成链表的翻转

创建n1,n2,n3三个指针,n3指向旧链表的第二个节点,n2指向旧链表的第一个节点,n1先置为空指针。

这样基本工作就准备完成了。

接下来,首先n2->next指向n1,再让n1移动到n2的位置,n2移动到n3的位置,n3往后移动,最后当n2为空时就停止循环。图解如下:

这是起始位置,现在演示循环一次,如图:

这就是循环一次的结果,这样就翻转过来了。

当n2是空指针时循环就可以停止了,再返回n1的位置这样整个代码基本就实现了

代码实现:

但是这个代码被报错了,因为我们没有考虑到链表为空的情况,当前链表为空的话,你对其进行解引用这就会报错了,所以我们要加上链表为空的情况。

此时的代码就正确了。

总结:思路二的好处是没用创建额外的空间进行解题,这样使得代码更加高效。当面试时要求不能创建额外空间解题时,思路一就用不了了。

二:移除链表元素:

203. 移除链表元素 - 力扣(LeetCode)

思路一:创建一个新链表,然后遍历旧链表,再将旧链表中值不为val的尾插到新链表中:

创建一个指针用来遍历旧的链表,再创建一个新的链表,newHead用来记录新链表的第一个节点的位置,newTail用来参与尾插的移动。

当pcur为空时就代表旧的链表已经走完。

先判断是否为空链表,如果为空链表则pcur即为新链表的头也为尾,最后返回链表的头即可。

如果不为空链表则尾插不为其值的元素

最后当旧链表遍历完如果newtail不为空就手动将其下一个节点置为空。

思路二:遍历原链表,将原链表节点为val的值给释放掉:

先创立两个指针都指向头节点,然后n2先走去找到要删除的节点,n1再走,若n2找到了要删除的节点,而此时n1在要删除节点的前面,所以此时刚好可以将n1的那个节点与n2->next的节点连接在一起。

这个就是上述思路的代码实现,此时运行一下,看看能不能过掉用例。

发现这个全是要删除的节点的用例无法通过,所以还要完善代码:

这个循环就是用来解决这个用例的,当每个节点都是要删除的时,循环就不断往下走,最后返回头节点,此时已经全部删完,所以,不会显示节点的值,此时再来运行测试一下

整个代码:

也是成功通过用例。

三:链表的中间节点:

876. 链表的中间结点 - 力扣(LeetCode)

思路一:利用计数器遍历原链表计算链表节点一共有多少,然后再将所有的节点数除以2再加1即可

然后再遍历一遍,找到那个中间节点,然后返回那个中间节点的位置。

先定义一个计数器,再定义一个指针用来遍历整个链表:

这个就是整个代码了,看看能否通过:

通过了。

思路二: 快慢指针:先定义两个指针,起初两个指针都指向第一个节点的位置,两个指针同时走,慢指针走一步,快指针走两步,最后当快指针走到空时,此时返回慢指针的位置,此时就是中间节点的位置:

     若链表节点数是奇或者是偶时,循环结束的条件不一样,当链表有奇数个节点时,

fast->next==NULL,此时slow停止的位置就是中间节点的位置,当链表有偶数个节点时,fast==NULL,此时slow停止的位置就是中间节点的位置。

根据图解现在来实现代码:

可以看出快慢指针的代码更加简单。

四:环形链表的约瑟夫问题:

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

这就是当有五个数,数到2就被删除的图解情况。

首先先编写一个创建链表节点的函数:

节点创建完毕,接下来要创建一个环形链表将首尾节点连接起来:

当这个for循环结束ptail的位置和phead的位置,此时5和1还没有连接起来,所以循环结束还有一个将这个尾和头连接起来的操作:

这就是连接起来的代码,但是ptail不能往下移动了,正好在phead的后面即可,这才是尾。

最后将数到val的值删掉即可:

整个代码如图:

五:合并两个有序链表:

21. 合并两个有序链表 - 力扣(LeetCode)

思路:建立两个指针遍历两个链表将小的值尾插到创建的新链表中

但是这里有几种情况:

第一种就是链表一为空或链表二为空,此时就返回不为空的链表的头节点即可

上述就是准备工作,接下来写比大小来尾插的代码:

但还有一个问题,list1和list2不一定相等,有可能list1长有可能list2长,所以还要考虑谁先走到尾的情况:

整体代码如图:

总结:这几个链表题说明了要利用好链表中节点的关系,并且还介绍了快慢指针,还介绍了建立多个指针来更加简单的解决问题。

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

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

相关文章

98%!汽车贷款行业合成身份欺诈案激增

近年来,合成身份欺诈者以汽车贷款行业为最大目标,导致 2023 年汽车贷款行业的欺诈尝试增加了 98%,损失高达 79 亿美元。Point Predictive 对 1.8 亿份贷款申请的研究发现,收入和就业信息不实、合成身份和信用洗白几乎占汽车贷款机…

仿照el-upload 封装自己的上传控件(el-upload 移动端无法吊起相机)

input选择图片的那个选择在h5的时候在去年下半年突然无法无法出现唤醒相机的选项 不知道出现的原因 发现el-upload作为h5的时候无法吊起相机 又因为需要对服务端地址图片进行回显(处于编辑功能的情况下 非新增 新增el-upload 可以实现回显) 两个功…

【快捷上手】UnrealEngine 的 关卡流 LevelStreaming 的三种加载方式

关键词: Unreal Engine,UE, LevelStreaming,动态,关卡,加载,切换关卡,换地图,子地图,子场景,子关卡,分包加载,动态载入 …

Python知识详解之爬虫

1.1 爬虫概念 爬虫又被称为网页蜘蛛、网络机器人,有时也被称为网页追逐者,是一种按照一定的规则,自动地抓取互联网上网页中相应信息(文本图片等)的程序或脚本,然后把抓取的信息存储到自己的计算机上。简单来说,爬虫就是…

6.99元租H800,部署Llama3,羊毛速来薅!

猛然间,大模型圈掀起一股“降价风潮”。 前脚,智谱、DeepSeek等大模型厂商将API价格一降再降,输入100万tokens仅需1元。 紧接着,GPU租赁的价格也被打了下来。 现在潞晨云官方进行限时大额算力补贴,NVIDIA H800的租用…

如何使用Shortemall自动扫描URL短链接中的隐藏内容

关于Shortemall Shortemall是一款针对URL地址安全与Web内容安全的强大工具,该工具基于纯Python开发,专为Web安全方向设计,可以帮助广大研究人员以自动化的形式扫描URL短链接中的隐藏内容。 Shortemall的全名为ShortEm All,该工具…

Pikachu 靶场 XXE 通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台,用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境,供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术,…

使用ffmpeg将本地摄像头推流至RTSP服务器,支持RTSP和RTMP协议

一、流媒体传输协议:RTSP和RTMP 1、RTSP和RTMP的工作原理 1.1)RTSP工作原理 用户设备向视频流平台发送RTSP请求。视频流平台返回可操作的请求列表,如播放、暂停等。用户设备发送具体的请求,如播放。视频流平台解析请求并启动相…

设计公司图纸防泄密|图纸加密软件推荐

随着信息技术的快速发展,设计行业面临着前所未有的挑战和机遇。然而,随着设计图纸的电子化存储和传输越来越普遍,如何确保图纸的安全性、防止泄密成为了一个亟待解决的问题。针对这一问题,设计行业专用图纸加密软件应运而生&#…

2024中国(重庆)机器人展览会8月举办

2024中国(重庆)机器人展览会8月举办 邀请函 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位: 重庆港华展览有限公司 2024中国重庆机器人展会将汇聚机器人全产业链知名企业,世界科技领先的生产制造企业与来自多个国家和地区…

测试人的福音:开源流量回放工具快速上手实践

笔者前段时间在参加测开大会时了解到了一款开源的自动化回归测试工具 AREX。主要是通过复制线上真实流量到测试环境进行回归测试,同时还做到了接口返回值的比对和写接口的验证,回放不会产生真实的数据或者调用,都是基于 Mock 数据的&#xff…

自动驾驶系统中的数据闭环:挑战与前景

目录 自动驾驶概况 1.1自动驾驶分级 1.2自动驾驶国内发展 ​1.3自动驾驶架构模型 数据闭环的意义 2.1 搜集corner case的数据 2.2 提高模型的泛化能力 2.3 驱动算法迭代 数据闭环落地的痛点及对策 3.1 数据采集和使用的合规性问题 3.2 数据确权问题 3.3 数据采集…

Modbus TCP转CAN网关在不同行业中的应用以及其使用上的优势

倍讯科技Modbus TCP转CAN网关通常被用于工业自动化领域,特别是在需要连接现有Modbus TCP网络和CAN总线设备的场景中。以下是该网关在不同行业中的应用以及其使用上的优势: 1. 制造业: - 在制造业中,各种类型的设备和机器通常使用不…

动态NAT

在上一章静态NAT中我们提过了,静态NAT只能一对一映射,无法有效缓解IPV4地址池紧张的问题,那么我们今天来学习一个新的技术——动态NAT,来解决这个问题。 第一章 1.1 动态NAT工作流程 动态NAT基于地址池来实现私有地址和公有地址的…

揭秘奔丰数字化运营管理

奔丰是一家专注于工程机械车辆座椅的生产商。奔丰借助蓝卓制造协同管理系统,进行设备数据采集、监控、预测性维护,全面规范企业资源和生产流程管理等,突破传统管理瓶颈,提升工厂整体效益,实现数字化运营。 在汽车智能化…

C++入门指南(中)

目录 ​编辑 一、C关键字(C98) 二、命名空间 2.1 域 2.2 命名空间域 2.1 命名空间定义 2.2 命名空间使用 三、C输入&输出 四、缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 五、函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理--名字修饰(name Mangling)…

x264 帧类型决策模块 x264_slicetype_analyse 函数原理分析

======================================================================== ======================================================================== x264帧类型决策 x264 的帧类型决策可以参考:

嵌入式学习第三十三天!(二叉树)

1. 树的概念: 1. 树:由n个结点组成的有限集,有且只有一个根结点(由根结点可以访问后继结点),其他结点只有一个前驱结点,但可以有多个后继结点(一对多)。当n 0时&#xf…

ST表(静态RMQ问题)

static Range Max/Min Query ST表 利用的是动态规划的思想 状态&#xff1a; //st[i][j]-->区间长度为1<<j&#xff0c;在区间[i,i1<<j-1]上的最值 状态转移方程&#xff1a; st[i][j]max(st[i][j-1],st[i(1<<j-1)][j-1]);#include <iostream> #inc…

基于51单片机的传送带调速产品计数proteus仿真设计+程序+设计报告+原理图+讲解视频

这里写目录标题 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 基于51单片机传送带计数仿真设计( proteus仿真程序设计报告原理图讲解…