链表经典面试题上

目录

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

题目一: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.xdnf.cn/news/1410232.html

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

相关文章

22-ESP32-S3模数转换器(ADC)

ESP32-S3模数转换器(ADC) 什么是模数转换器(ADC)🔍? 模数转换器(ADC)是一种将模拟信号(如电压)转换为数字信号的设备。在ESP32-S3中,ADC用于将模…

深入图像分类:使用美国手语数据集训练定制化神经网络

引言 在前一篇博客中,我们探讨了如何使用MNIST数据集训练一个基础的神经网络来进行手写数字识别。在本文中,我们将更进一步,使用美国手语字母表(ASL)数据集来构建一个定制化的图像分类模型。通过这个过程,…

羊大师:羊奶营养好选择

羊大师:羊奶营养好选择 羊奶确实是一种营养丰富的饮品,它被视为乳品中的精品,被称为“奶中之王”是世界上公认的最接近人奶的乳品。以下是一些羊奶的主要营养成分和其对人体的益处: 蛋白质:羊奶中的蛋白质含量丰富&a…

k8s部署maven项目

failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题,看了一圈首次搭建k8s的都是高频出现的问题。 couldn’t get current server API group list: Get “https://kubernetes.docker…

什么是死锁?代码演示,死锁如何排查和解决

死锁的概念 死锁是指在多线程或多进程中,两个或两个以上的线程或进程在执行过程中,因抢夺资源而造成的一种相互等待的现象。简单来说,就是两个或两个以上的线程或进程都在等待对方释放资源,从而导致所有线程或进程都无法继续执行的…

【python】python标准化考试系统[单项选择题 简易版](源码)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

[python]texthero安装后测试代码

测试环境: anaconda3python3.8 texthero1.1.0 测试代码来自官方:https://github.com/jbesomi/texthero 代码: import texthero as hero import pandas as pddf pd.read_csv("https://gitee.com/FIRC/texthero/raw/master/dataset/…

解决Linux中磁盘满/dev/vda1使用率100%问题

发现根目录下占用100%,具体还要排场到底是有哪些大文件占用 那么就在根目录下查询各个子文件夹的占用状态,有过大不用的即可删除 df -h *我的磁盘是100G,但这些总共加起来也接近不了这个数值 那就是有可能出现 已删除空间却没有释放的进程…

用python画一个正八边形

1 问题 使用turtle库的turtle.fd()函数和turtle.seth()函数绘制一个边长100的正八边形。 2 方法 1、利用for循环解决如何画出图形中相同的八条边的问题。 2、再利用turtle.fd()函数和turtle.seth()函数画出完整的图形。 代码清单 1 import turtleturtle.pensize(2)d0for i in r…

Mybatis进阶(映射关系多对一 )

文章目录 1.需求分析2.应用实例(xml配置)1.数据表设计2.entity设计(不要使用toString会栈溢出)1.Pet.java2.User.java 3.编写Mapper1.PetMapper.java2.UserMapper.java 4.编写Mapper.xml1.UserMapper.xml2.PetMapper.xml 5.测试Us…

初识Vue-组件化开发(应用实例)

目录 一、任务管理应用 1.介绍 2.代码 1. 任务列表组件 (TaskList.vue) 2. 添加任务组件 (AddTask.vue) 3. 应用入口组件 (App.vue) 4. 主入口文件 (main.js) 3.效果 4.总结 二、购物车 1.介绍 2.代码 1. 商品列表组件 (ProductList.vue) 2. 购物车组件 (Cart.vue…

Web APIs 学习归纳6--- BOM浏览器对象

前面几节主要针对DOM进行了学习,现在开始新的内容的学习---DOM浏览器对象。 DOM是更注重页面(document)内容的设计,但是BOM不仅限于页面(document)的设计,而是更加全面包括页面的刷新&#xff0…

【数据结构】:链表的带环问题

🎁个人主页:我们的五年 🔍系列专栏:数据结构 🌷追光的人,终会万丈光芒 前言: 链表的带环问题在链表中是一类比较难的问题,它对我们的思维有一个比较高的要求,但是这一类…

拌合楼管理系统(十六)c#如何实现点击同时启动两个窗体,并且窗体全部关闭后才退出程序

前言: 好长时间没有再写博文了,最近项目有个需求,无人值守程序需要一个client端,主要实现两个功能,一个是显示安装的四个监控的画面,一个是显示地磅称重数量和车牌列表等一些信息。今天主要解决如何显示两个…

SQL注入漏洞--报错/union/布尔盲注/时间盲注

之前介绍了数据库的基本操作,今天这篇文章就来实操SQL注入。 阅读本文前可以先看一下基本操作,有助于更换理解本文。。。 https://blog.csdn.net/weixin_60885144/article/details/138356410?spm1001.2014.3001.5502 what SQL---结构化查询语言---S…

【目标检测】DEtection TRansformer (DETR)

一、前言 论文: End-to-End Object Detection with Transformers 作者: Facebook AI 代码: DEtection TRansformer (DETR) 特点: 无proposal(R-CNN系列)、无anchor(YOLO系列)、无NM…

从一到无穷大 #25 DataFusion:可嵌入,可扩展的模块化工业级计算引擎实现

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言架构总览与可扩展性Catalog and Data SourcesFront End逻辑计划与逻辑计划优化器…

美国零售媒体(广告业)指南:快速增长、不断扩展的业态和新兴机遇

Guide to retail media: Rapid growth, expanding formats, and emerging opportunities --- 零售媒体如何通过CTV和其他合作伙伴关系向上发展 原文作者:Sara Lebow | 2024年2月16日 整理编辑:数字化营销工兵 I 2024年5月2日 ​​​​​​​ &#…

Agent AI智能体:如何借助机器学习引领科技新潮流

文章目录 📑前言一、Agent AI智能体的基本概念二、Agent AI智能体的技术进步2.1 机器学习技术2.2 自适应技术2.3 分布式计算与云计算 三、Agent AI智能体的知识积累3.1 知识图谱3.2 迁移学习 四、Agent AI智能体的挑战与机遇4.1 挑战4.2 机遇 小结 📑前言…

python学习笔记B-15:序列结构之字典--字典的创建与删除

字典的创建与删除方法: import random #第1种创建方式 d {10:"cat", 20:"dog", 30:"monkey"} print(d) #第2种创建方式 lst1 [10,20,30] lst2["cat","dog","monkey"] d zip(lst1,lst2) print(dict…