链表经典面试题上

目录

创作不易,如若对您有帮助,还望三连,谢谢!!!

题目一:203. 移除链表元素 - 力扣(LeetCode)

题目二:206. 反转链表 - 力扣(LeetCode)

题目三:876. 链表的中间结点 - 力扣(LeetCode)

题目四:面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)

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

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

题目七:160. 相交链表 - 力扣(LeetCode)

题目八:141. 环形链表 - 力扣(LeetCode)

拓展问题:


创作不易,如若对您有帮助,还望三连,谢谢!!!

之前我们学习了单链表,实现了单链表的一系列的功能,今天我们来讲解一下链表的一些经典面试题目,以便巩固我们对链表的理解。

话不多说,我们直接来看题目:

题目一:203. 移除链表元素 - 力扣(LeetCode)

我们看题目:给定一个单链表和头结点,让我们删除所有满足 Node.val == val 的节点,并返回 新的头节点 。

思路:创建新链表,遍历原链表,将原链表中值不为val的节点尾插到新链表中。我们之前在实现单链表功能中写过尾插的方法,所以这里就不在赘述,代码如下:

这段代码创建了一个新的带头单链表,并将原链表中满足条件的节点进行尾插,最后释放了dummy,防止内存泄漏。

那么,这段代码有问题吗?有什么问题呢?

有小伙伴会说:没有考虑链表为空的情况,题目说了链表可能为空。仔细看我们这段代码:当head为空时,不会进入while循环,最后返回NULL,没有什么问题,那么我们代码是正确的吗?我们先运行一下代码:

结果有问题,为什么最后一个值为6的节点没有被删除呢?我们回头看一下我们尾插的代码:

最后一步,pcur指向最后一个节点,节点的值为6,不满足条件,故pcur指向NULL,跳出while循环,但此时新链表最后一个节点(值为5)的next指针指向哪里呢?我们并没有修改它,所以它会指向原链表的最后一个节点,所以才会引发错误,所以我们只需要在while循环后加入一个 :newTail->next=NULL即可,修改后的代码如下:

题目二:206. 反转链表 - 力扣(LeetCode)

这一题同样提供两种思路:

思路一:创建新链表,遍历原链表,在新链表中进行头插操作,从而达到反转链表的目的。

思路二:定义三个指针,用三个指针遍历链表,在原链表上完成反转操作。

思路一我们之前也讲过头插,代码比较简单,我们主要讲一下思路二:

代码如下:

题目三:876. 链表的中间结点 - 力扣(LeetCode)

这里的思路是快慢指针:创建两个指针,慢指针一次走一步,快指针一次走两步,最后快指针走到尾时,慢指针指向的节点就是中间节点。

思路示意图如下:

那么我们肯定要写一个循环,循环结束条件是什么呢?看上面的示意图,我们可以得出是:

fast不为空,并且fast->next不为空,代码如下:

注意:循环判断条件不能交换位置,即写成:fast->next &&fast,因为当链表节点个数为奇数时,最后fast为NULL,改变顺序不就变成对空指针解引用了吗?

题目四:面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)

 

思路:快慢指针,两个指针初始相差k步,最后fast指向NULL时,slow指向的就是链表倒数第k个节点。思路示意图如下:

代码如下:

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

思路:创建一个新链表,遍历原来两个链表,将两个链表节点的值进行比较,值晓得节点尾插到新链表后

代码如下:

这段代码要注意的一点是:出了while循环后有两种情况:要么是list1为空,要么是list2为空,所以我们要连接不为空的链表。

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

思路:创建两个带头链表,一个小链表,一个大链表

把原链表中值小于x的节点尾插到小链表中,把原链表中值大于x的节点尾插到大链表中

最后,把小链表的尾连接到大链表的第一个有效节点上。

代码如下:

仔细看看上面代码,看看有没有问题?

看似没有什么问题,我们来运行一下:

这是为什么呢?我们来分析一下:

最后我们的代码运行结果为上图所示,这时有一个问题:大链表最后一个节点的next指针指向谁呢?我们并没有改变它的next指针,所以他指向的是小链表中的最后一个节点,示意图如下:

这不变成带环链表了吗?所以才会超出时间限制,我们只需要把大链表的最后一个节点指向NULL,即可,代码如下:

题目七:160. 相交链表 - 力扣(LeetCode)

思路:先遍历两个链表,记录两个链表的节点个数m,n

然后通过尾节点是否相等来判断两个链表是否相交,因为两个链表只要相交,尾节点必定为同一个。

最后快慢指针,快指针比慢指针多走m--n的绝对值步,从而找到第一个交点。思路图如下:

代码如下:

题目八:141. 环形链表 - 力扣(LeetCode)

首先,我们先说思路:快慢指针,快指针一次走两步,慢指针一次走一步

如链表有环,必能在环中相遇。

代码如下:

那么,为什么有环的话,快慢指针一定会在环中相遇呢?讲解在下图:

这不就变成追击相遇问题了吗?fast速度相当于2,slow速度相当于1,两者距离为△x,变换参考系,以slow为参考系,fast相对速度为1,所以一定能追上。

拓展问题:

如果fast一次走3步,4步....n步,还一定能在环中相遇吗?

我们在下篇文章中接着讲解这个问题。

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

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

相关文章

python学习笔记----安装pycharm(1)

一、安装pycharm 1. 下载并安装pycharm https://www.jetbrains.com/pycharm/download2.汉化pycharm 安装插件并重启IDE完成汉化 二、 第一个python程序

【机器学习】机器学习在教育领域的应用场景探索

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

【设计模式】17、iterator 迭代器模式

文章目录 十七、iterator 迭代器模式17.1 user_slice17.1.1 collection_test.go17.1.2 collection.go17.1.3 iterator.go17.1.4 user.go 十七、iterator 迭代器模式 https://refactoringguru.cn/design-patterns/iterator 为了集合数据的安全性, 或方便迭代, 可以用迭代器接口…

axios 中文文档 翻译

0.18.0的版本更新有一段时间了,使用起来跟原先基本没有什么变化。但是增加了一些功能,例如错误处理的辨别,于07-06-2018重新翻译和校验了该翻译,更正了一些错别字和表达不准的地方,但是难免仍有错误,欢迎指…

GitLab服务器的搭建

GitLab服务器的搭建 为公司搭建一台代码托管服务器 服务器规格:2vCPUs4GiB20G 操作系统:RockyLinux8.8 下载软件 gitlab官网:http://about.gitlab.com 在官网下载比较麻烦,推荐从《清华大学开源软件镜像站》下载 清华大学开…

DRF序列化器基本使用

DRF序列化器基本使用 对用户提交的数据进行校验从数据库中取到数据进行序列化,转化为JSON格式返还给前端 1 序列化数据 1.1 Serializer # models.py from django.db import modelsclass Depart(models.Model):"""部门表"""title …

[前端] Bearer令牌

Bearer令牌是一种常用的认证方式,特别是在实现OAuth 2.0协议时。Bearer令牌本质上是一个安全字符串,可以是任意的字符序列,用以证明持有者(Bearer)有权访问特定的资源。其名称“Bearer”意味着任何持有该令牌的人都可以…

38-3 Web应用防火墙 - 安装配置WAF

首先需要安装Centos 7 虚拟机:Centos7超详细安装教程_centos7安装教程-CSDN博客 安装配置WAF 在桌面环境中,右键点击打开终端,首先执行以下步骤: 1)安装必要的工具: 输入命令: sudo su yum install -y wget epel-release 2)第二步,安装依赖工具,输入以下命令: y…

阿里云CentOS7 打开/关闭防火墙 开放端口

#查看防火墙状态# systemctl status firewalld #关闭防火墙# systemctl stop firewalld #打开防火墙# systemctl start firewalld #添加开放2375端口# firewall-cmd --add-port2375/tcp --permanent #重载入添加的端口# firewall-cmd --reload #查询2375端口是否开启成…

【嵌入式AI开发】轻量化卷积神经网络Mnasnet(神经架构搜索)详解

前言:谷歌轻量化卷积神经网络Mnasnet,介于MobileNet V2和V3之间。使用多目标优化的目标函数,兼顾速度和精度,其中速度用真实手机推断时间衡量。提出分层的神经网络架构搜索空间,将卷积神经网络分解为若干block,分别搜索各自的基本模块,保证层结构多样性。 CVPR2019论文…

深入理解网络原理1

文章目录 前言一、网络初识1.1 IP地址1.2 端口号1.3 协议1.4 五元组1.5 协议分层 二、TCP/IP五层协议三、封装和分用四、客户端vs服务端4.1 交互模式4.2 常见的客户端服务端模型4.3 TCP和UDP差别 前言 随着时代的发展,越来越需要计算机之间互相通信,共享…

大模型咨询培训叶梓老师:数千大模型,1张GPU搞定——UC Berkeley提出全新微调方法S-LoRA

在大语言模型(LLM)的部署中,通常采用“预训练-微调”范式。为了适应多样化的任务,参数高效的微调方法如低秩适应(LoRA)被广泛使用。然而,如何高效地服务这些微调变体仍然是一个未探索的问题。S-…

VBA技术资料MF147:从Excel运行PowerPoint演示文稿

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

redis ZRANGE 使用最详细文档

环境: redis_version:7.2.2 本文参考 redis 官方文档1 语法 ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]参数含义key是有序集合的键名start stop在不同语境下,可用值不一样BYSCORE | BYLEX按照分数查询 | 相…

OceanBase 分布式数据库【信创/国产化】- OceanBase 数据库的发展历程

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase 数据库的发展历程前言OceanBase 数据更新架构OceanBase 数据库的发展历程OceanBase 分布式数据库【信创/国产化】- OceanBase 数据库的发展历程 编辑 | 简简单单 Online zuozuo 地址 | https:…

React 15~18每个阶段更新了什么

文章目录 React 15React 16React 17 试验性并发模式React 18 React 15 React.createClass (弃用) class 组件 函数组件(无状态、纯UI组件) 堆栈diff(同步更新state1->state2->state3…、每个更新过程不可中断&a…

【SQL每日一练】统计复旦用户8月练题情况

文章目录 题目一、分析二、题解1.使用case...when..then2.使用if 题目 现在运营想要了解复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况,请取出相应明细数据,对于在8月份没有练习过的用户,答题数结果返回0. 示例代码&am…

13、Flink 的 Operator State 详解

1.算子状态 (Operator State) 算子状态(或者非 keyed 状态)是绑定到一个并行算子实例的状态,Kafka consumer 每个并行实例维护了 topic partitions 和偏移量的 map 作为它的算子状态。 当并行度改变的时候,算子状态支持将状态重…

Excel 批量获取sheet页名称,并创建超链接指向对应sheet页

参考资料 用GET.WORKBOOK函数实现excel批量生成带超链接目录且自动更新 目录 一. 需求二. 名称管理器 → 自定义获取sheet页名称函数三. 配合Index函数,获取所有的sheet页名称四. 添加超链接,指向对应的sheet页 一. 需求 ⏹有如下Excel表,需…

Java 正则表达式代码演示

正则表达式(Regular Expressions)是一种用于描述字符串匹配模式的强大工具。在 Java 中,可以使用 java.util.regex 包来处理正则表达式。 文章目录 一、基本用法二、高级用法 一、基本用法 导入正则表达式类: import java.util.regex.Patte…