代码随想录Day 3 | 【链表理论基础】203.移除链表元素、707.设计链表、206.反转链表

代码随想录day3|链表理论基础|203.移除链表元素|707.设计链表|206.反转链表 链表的定义: 链表的增添和删除都是O(1)操作,查找的时间复杂度是O(n)。链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。力扣题目链接(opens new window)题意:删除链表中等于给定值 val 的所有节点。示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]示例 2: 输入:head = [], val = 1 输出:[]示例 3: 输入:head = [7,7,7,7], val = 7 阅读详情
了解链表基础,以及链表和数组的区别

文章链接:代码随想录

一、链表理论基础

1. 链表的类型

(1)单链表:链表是由通过一些指针串连起来的线性结构。主要有数据域和指针域(指针域存放的指针指向下一个节点),链表入口节点称为头节点head,最后一个节点的指针域指向NULL。

(2)双链表:单链表的指针只能指向下一个节点,而双链表有两个指针,前面一个指针指向上一个节点,下一个指针指向下一个节点;双链表既可以向前查询,也可以向后查询。

(3)循环链表:即链表首尾相连,可以用来解决约瑟夫环问题。

2. 链表的存储方式

        数组是内存中连续分布的;而链表是通过指针链接在内存中的各个节点,所以链表的内存空间不是连续分布的,而是散乱地分布在内存的某地址上,分配机制取决于操作系统的内存管理。

3. 链表的定义

        注意:平时在刷 leetcode 时,链表定义是默认给出的,但在面试中一旦要求手写链表,是需要自己进行链表定义的。

        以下是python定义链表节点的方式:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

4. 链表的操作

(1)删除节点:

        不是直接删除,而是将C节点的指针指向E节点,即移动指针由C-->D到C-->E。C++需要手动释放这块内存,而其他语言有自己的回收机制。

(2)添加节点:要添加节点F,需要先让F的指针指向D节点,然后让C节点的指针指向F节点。

        删除和添加操作的时间复杂度都是O(1),但如果要删除最后一个节点,需要通过头指针查找到第N-1个节点进行删除,那么查找的时间复杂度是O(n)。

5.性能分析

插入/删除(时间复杂度)查找(时间复杂度)适用场景
数组O(n)O(1)数据量固定,频繁查找,增删较少
链表O(1)O(n)数据量不固定,频繁增删,查找较少

        数组在定义的时候长度就是固定的,如果想改动数组长度,需要重新定义数组。链表长度不固定,并且动态增删,适合数据量不固定、频繁增删、较少查询的应用场景。

本题最关键是要理解 虚拟头结点的使用技巧,这个对链表题目很重要。

题目链接/文章讲解/视频讲解::代码随想录

二、203.移除链表元素

1. 看到这道题的第一想法

        首先定义一个虚拟头节点dummy_head,然后让它指向头节点head,因为如果需要删除的节点是头节点,那么需要分类讨论,而采用虚拟头节点的方式可以统一算法规则。

        接下来遍历所以的节点,当节点数据域等于给定的整数时,则将上一个节点的指针指向下下个节点,就可以完成删除值等于val的节点操作。

2. 看完代码随想录后的想法

        (1)定义虚拟头节点及初始化目前指针指向的节点。

        注意目前指针也是指向虚拟头节点,而不是头节点。因为如果current = head,那么当val等于头节点时(即删除的元素是头节点)那么无法进行删除;

        首先明确我们需要删除的元素必须是current.next,删除的操作才会是current 指向 current.next.next,也就是把current.next.next赋值给current.next(current.next = current.next.next)。

        其次需要注意的是初始化定义虚拟头节点的代码如下:

dummy_head = ListNode(next = head)

        (2)循环遍历每一个节点,寻找数据域等于val的节点,并将其删除:首先为了防止空指针的出现(指针异常)所以将current.next非空作为循环条件,接下来判断current.next的值是否为val,如果是的话,则current的下一个节点变更为下下个节点,即current.next = current.next.next,如果不是则继续遍历下一个节点。

        (3)最后返回dummy_nead.next,因为如果删除的是头节点的话,那么这个链表就没有头节点了,所以引入虚拟头节点,那么进行删除操作后,返回dummy_head的下一个节点仍然是这个链表的头节点,无论新旧。

这是一道考察链表综合操作的题目,不算容易,可以练一练 使用虚拟头结点

题目链接/文章讲解/视频讲解:代码随想录

三、707.设计链表

1. 看到这道题的第一想法

(1)获取第n个节点的数值:

        从头节点开始依次遍历一直到下标为n的节点,返回其数值。

(2)头部插入节点:

        定义虚拟头节点dummy_head,然后定义一个临时指针指向当前的head头节点(即暂时存放虚拟头节点,因为一旦dummy_head指向新的头节点,那么原始头节点就找不到了,于是先将原始头节点存放起来),然后将dummy_head.next指向新的头节点,再让新的头节点指向临时指针(也就是暂时存放原始头节点的指针)。

(3)尾部插入节点:

        从头节点开始遍历所有节点,一直到最后一个节点的next指向的是NULL,然后定义一个新节点,将新节点的指针指向NULL,再让最后一个节点的next指向新节点。

(4)前n个节点前插入:

        定义新节点,然后从头节点遍历到第N个节点,将新节点的next指向第n个节点的Next,再移动第n个节点的指针指向新节点。

(5)删除第n个节点:

        定义临时指针进行循环遍历链表,直到第n个节点的前一个节点就跳出循环,然后使得current.next指向current.next.next,最后size-1。

2. 看完代码随想录后的想法

        这道题目统一使用虚拟头节点的方式进行操作,可以保证操作的一致性。

(1)获取第n个节点的数值:

        A.明确链表是从0开始,到n-1结束的;B.要对节点下标做限制,超出合法范围则下标无效,也就是n < 0 或者 n > size-1 则无效;C.需要定义临时指针来遍历链表,并且让临时指针current指向dunmmy_head.next(即头指针),而不能直接操作头指针,否则最后返回头指针而头指针的值已被更改,无法返回完整链表;D.依次遍历链表节点(从0到n-1)就是第n个节点,最后返回第n个节点的数值即可。

(2)头部插入节点:

        A.定义一个值为val的新节点NewNode;B.先将新节点的指针NewNode.next指向head(必须写成dummy_head.next),然后再将dummy_head.next指向新节点。注意写代码在操作指针的时候要将self写上,比如self.head而不是head。C. 最后size加1。

(3)尾部插入节点:

        A.定义一个新节点NewNode,默认它的next指向NULL;B.定义一个临时指针current用于遍历链表所有节点,一直到尾节点(尾节点的判定条件:next指向的是null);C.让尾节点current直接指向NewNode; D.最后size加1。

(4)前n个节点前插入:

        注意:是在第n个节点前插入,而不是在第n个节点后插入!!A.判断index是否有效;B.遍历节点直到第n个节点的前一个节点,就结束循环;C.定义新节点,并且新节点指向第n个节点;.然后将第n个节点的前一个节点指向新节点;D.最后size加1。

(5)删除第n个节点:

A.判断index是否有效;B.遍历节点直到第n个节点的前一个节点,就结束循环;C.current.next = current.next.next;D.最后size-1。

3. 实现过程中遇到的困难及解决

(1)关于界定index下标有没有效的问题:

        一般情况下例如删除、查询的时候,index应该满足>=0或者<=self.size-1,只有在添加的时候,index是可以等于self.size的,因为最终它的size+=1。

(2)关于初始化节点的时候:init前后一定是双下划线!!__init__(下划线是两根连起来)

class ListNode:
    def __init__(self,val=0,next = None):
        self.val = val
        self.next = next
    
class MyLinkedList:
    def __init__(self):
        self.dummy_head=ListNode()
        self.size = 0

(3)定义新节点时,应该写定义函数,而不是直接写newnode = listnode(...),在这道题目中直接调用ListNode类即可。self.dummy_head.next =ListNode(val,self.dummy_head.next)。

(4)本题目中使用虚拟头节点时,应该调用对象self才可以,因为虚拟头节点被定义在了初始化函数中。self.dummy_head.next。

(5)在进行插入节点后,需要最后size加1;删除节点就size-1。

题目链接/文章讲解/视频讲解: 代码随想录

四、206.反转链表(面试高频)

1. 看到这道题的第一想法

        首先,定义一个current指针用于遍历链表;然后定义一个临时指针用于存放current指向的下一个节点,也就是即将改变方向的节点;接下来反转指针由指向下一个节点转变为指向上一个节点;注意结束循环的条件及边界点。

2. 看完代码随想录后的想法

(1)双指针法

        A. 定义一个current用于遍历链表的每一个节点;定义一个pre指针,代表current反转后的next,用于反转链表,初始化为None,因为反转后的链表pre是尾节点。

        B. 进入循环遍历,以current不为NULL为循环条件;

        C. 定义一个临时指针temp用于存放原来的current.next,因为方向一旦改变就无法查找到这个节点了,也就无法进行反转链表;然后反转链表操作,将current.next指向pre,然后移动pre和current进行下一轮循环。

        D.当current指向NULL时停止遍历,此时pre是链表的头节点,所以返回pre即可。

(2)递归法

        A. 主函数直接调用我们即将定义的反转函数reverse;

        B.定义reverse函数:同双指针法

3. 实现过程中遇到的困难及解决

(1)双指针法:pre指针的初始化为None,而不是NULL。

(2)递归法:注意定义方式和调用方式。

Python入门基础教程(非常详细) Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」。Python类库(模块)极其丰富,这使得Python几乎无所不能,不管是传统的Web开发、PC软件开发、Linux运维,还是当下火热的机器学习、大数据分析、网络爬虫,Python都能胜任。这套Python基础教程不是教科书,不会玩弄概念,而是力求口语化和通俗化,让读者尽快入门。如果有小朋友出于兴趣学习Python,请引导他阅读本教程的前半部分,这是基础,可以降低学习成本;... 阅读详情

相关推荐

STC8H开发(十六): GPIO模拟SPI驱动Ci24R1实现低成本无线遥控

本文详细介绍了如何使用STC8H单片机通过GPIO模拟SPI驱动Ci24R1无线模块,实现低成本无线遥控方案。内容涵盖硬件设计要点、软件驱动开发技巧及实战优化经验,特别适合消费电子产品开发者参考。Ci24R1凭借其高性价比和双模协议支持,成为替代传统nRF24L01+的理想选择。

weixin_30378623的博客 349

Studying-代码随想录训练营day3| 链表理论基础、203.移除链表元素、707设计链表、206反转链表

训练第三天,链表理论基础、203.移除链表元素、707设计链表、206反转链表

yachihaoteng的博客 1355

从网口变压器到TVS管:手把手设计通过4KV浪涌的以太网电路

本文详细解析工业级以太网接口4KV浪涌防护设计,从网口变压器选型到TVS管布局,提供通过IEC61000-4-5标准测试的完整方案。重点介绍Bob Smith电路优化和PCB设计技巧,帮助工程师有效应对雷电感应和设备开关瞬态干扰,确保工业设备稳定运行。

study的专栏 284

代码随想录day3|链表理论基础、203.移除链表元素、707.设计链表、206.反转链表

代码随想录day3

xccxynb的博客 916

贝叶斯校准在计算机模型不确定性分析中的实践指南

本文深入探讨了贝叶斯校准在计算机模型不确定性分析中的核心原理与实践方法。通过将模型从“黑箱”转变为“透明箱”,该方法系统量化了参数不确定性、模型结构缺陷及观测误差。文章重点阐释了如何利用高斯过程作为代理模型和模型不足函数,构建完整的贝叶斯校准框架,并提供了从数据准备、模型训练到MCMC推断及不确定性分析的实战指南,最终实现更可靠的预测与决策支持。

weixin_29088655的博客 292

Python xlwings报错解决:从‘NoneType‘到完美运行WPS表格的完整指南

本文深入解析了使用Python xlwings库自动化WPS表格时遇到的经典'NoneType'报错(AttributeError: 'NoneType' object has no attribute 'apps')的根源与解决方案。核心在于pywin32版本与WPS的兼容性问题,文章提供了从版本降级、依赖管理到构建健壮自动化环境的完整实战指南,帮助开发者彻底解决兼容性难题,实现稳定运行。

n4o5p6q7r的博客 303

代码随想录Day3--链表理论基础 ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表

昨天出去旅游了,Day2的任务留到周末再完成吧,今天学习链表!

B7_0729的博客 1374

20240128 C#与SCPI协议实战:轻量级仪器控制库ScpiNet应用指南

本文详细介绍了轻量级C#库ScpiNet在仪器控制中的应用。相较于传统的NI-VISA,ScpiNet无需安装庞大运行时,通过纯C#实现直接与USB或以太网设备通信,支持跨厂商SCPI仪器。文章提供了从快速连接到实战封装、错误处理的完整指南,帮助开发者构建简洁高效的自动化测试系统。

h9j8k7l6m5n的博客 547

# 代码随想录Day3 链表理论基础|203.移除链表元素|707.设计链表|206.反转链表

示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL。示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]示例 2: 输入:head = [], val = 1 输出:[]你可以选择使用单链表或者双链表,设计并实现自己的链表。题意:删除链表中等于给定值 val 的所有节点。单链表:指针域只能指向节点的下一个节点。

爱因斯小柚的博客 1118

【实战指南】DBeaver EE Windows版高效破解与配置全解析

本文详细解析了DBeaver EE Windows版的高效破解与配置方法,涵盖Java环境配置、破解包部署、配置文件修改等关键步骤,并提供了性能优化和数据库连接的最佳实践。适用于需要解锁企业版高级功能的数据库开发人员,帮助提升工作效率。

weixin_28837817的博客 1902

【IPAM】Netbox docker模式版本升级

NETBOX 是一个开源的网络资源管理系统,主要用于管理 IP 地址、机架、设备、接口等网络资源信息。下面是 NETBOX 的功能、优点和缺点的详细介绍。

u012153104的博客 1329

Day3代码随想录:链表理论基础 203.移除链表元素 707.设计链表 206.反转链表

int val;1所以如果不定义构造函数使用默认构造函数的话,在初始化的时候就不能直接给变量赋值!

weixin_55956746的博客 1221

MOS管驱动电路设计全攻略

MOS管驱动电路设计全攻略

让你爱上电路设计 3634

代码随想录|day3打卡:链表理论基础,203.移除链表元素,707.设计链表,206.反转链表

代码随想录|day3打卡:链表理论基础,203.移除链表元素,707.设计链表,206.反转链表

qq_18746745的博客 837

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

代码随想录算法训练营Day3 | 链表理论基础、203.移除链表元素、707.设计链表、206.反转链表

训练营第三天:链表理论基础、203.移除链表元素、707.设计链表、206.反转链表

jiabao0520的博客 1077

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

代码随想录刷题day3丨链表理论基础,203.移除链表元素,707.设计链表,206.反转链表

/ 结点的值int val;// 下一个结点// 节点的构造函数(无参)// 节点的构造函数(有一个参数)// 节点的构造函数(有两个参数)

m0_75195038的博客 715

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[代码随想录打卡 Day3] 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表

代码随想录训练营Day3打卡。呜呜呜太难了。消化一下明天一定整完这周的。

goodenough5的博客 624

代码随想录算法训练营day3|链表理论基础、203.移除链表元素、707.设计链表、206.反转链表

/ 结点的值int val;// 下一个结点// 节点的构造函数(无参)// 节点的构造函数(有一个参数)// 节点的构造函数(有两个参数)

weixin_62100455的博客 693

代码随想录day3|链表理论基础,203. 移除链表元素,707. 设计链表, 206.反转链表

链表

qq_45948139的博客 1673

代码随想录算法训练营Day3 | 链表理论基础、203.移除链表元素、707.设计链表、206.反转链表 | Python | 个人记录向

链表:链表理论基础、203.移除链表元素、707.设计链表、206.反转链表。算法:链表虚拟节点、双指针、递归。

Python基本算法 805

代码随想录算法训练营Day3 | 链表理论基础,203.移除链表元素,707.设计链表,206.反转链表

little__penguin的博客 512

代码随想录算法训练3day| 链表理论基础 、203.移除链表元素、707.设计链表 、 206.反转链表。

链表操作

weixin_53333922的博客 3714

代码随想录训练营Day3 | 链表理论基础 | 203.移除链表元素 | 707.设计链表 | 206.反转链表

单链表的定义 (特别注意,在面试中可能需要自己定义链表// 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数。

m0_68965961的博客 951

代码随想录算法训练营Day3——链表篇|链表理论基础、203. 移除链表元素、707. 设计链表、206. 反转链表

leetcode题目:移除链表元素、设计链表、反转链表

weixin_44837088的博客 805

一刷代码随想录Day3(链表理论基础 ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表 )

int val;//链表节点数据域//指向下一节点的指针Listnode(int v):val(v),next(null){}//构造函数//若定义了有参构造函数可以如下定义节点://若未定义有参构造函数,使用默认构造函数则声明与初始化必须分开。定义链表时,都使用head指针指向每个链表,再按顺序将链表节点的head指针赋值给上以节点的next指针。将需要删除的节点的前一节点的next指针指向下一个保留下来的节点即可,在Cpp中最好还要手动释放(delete)这块内存。

2301_76661918的博客 954

代码随想录算法训练营 Day 3,链表理论基础, 203.移除链表元素,707.设计链表, 206.反转链表

链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。203.移除链表元素。

Icewolf273的博客 333
上一篇: 代码随想录Day 2 补充【前缀和】+【数组篇总结】 | 58.区间和、44.开发商购买土地
下一篇: 代码随想录 Day 4 | 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II 、【链表】总结
Accept17
博客等级 码龄4年 479粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值