首页 > 其他分享 >链表专题--基础知识

链表专题--基础知识

时间:2023-04-10 20:23:23浏览次数:51  
标签:val -- 基础知识 链表 内存 next 节点 指针

参考链接:代码随想录

链表是一种通过指针串联在一起的线性结构,每个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。

链表的入口节点称为链表的头节点也就是head,链表示意图如下所示:

 

 

链表的类型

单链表

刚才说的就是单链表。

双链表

单链表中的指针域只能指向节点的下一个节点

双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

双链表既可以向前查询也可以向后查询,示意图如下图所示:

 

 

循环链表

 循环链表就是收尾相连的链表,可以用来解决约瑟夫环的问题。

链表的存储方式

了解完链表的类型,我们来学习一下链表在内存中的存储方式。

数组在内存中是连续分布的,但是链表在内存中不是连续分布的。

链表是通过指针域的指针链接在内存中的各个节点。

所以链表中的节点在内存中不是连续分布的,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理,

如图所示:

 

 

这个链表起始节点为2,终止节点为7,各个节点分布在内存的不同地址空间上,通过指针串联在一起。

链表的定义

接下来看一下链表的定义。

此处我们先看C/C++的链表定义方式:

// 单链表
struct ListNode {
    int val;  // 节点上存储的元素
    ListNode *next;  // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};

python版本:

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

链表的操作

删除节点

删除D节点,如图所示:

 

 

只需要将C节点的next指针指向E节点,就可以达到删除D节点的目的。

D节点此时依然留在内存中,只是不在这个链表中了,在C++中最好手动释放这个节点,回收内存。其他语言例如Java、python,就有自己的回收机制,不用手动释放。

添加节点

如图所示:

 

可以看出链表的增添和删除是O(1)操作,不会影响到其他节点。

但是需要注意,要是删除第五个节点,则需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)。

性能

把数组和链表的特征进行对比,如图所示:

 

数组在定义的时候,长度是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。

链表的长度可以是不固定的,并且可以动态删减,适合数据量不固定,频繁删减,较少查询的场景。

 

标签:val,--,基础知识,链表,内存,next,节点,指针
From: https://www.cnblogs.com/lbwBH/p/17304173.html

相关文章

  • flask6
    今日内容1sqlalchemy快速插入数据#sqlalchemy是什么orm框架,跟其他web框架没有必然联系,可以独立使用#安装,快速使用,执行原生sql#创建表和删除表 -不能创建数据库-不能修改字段(增加,删除)#使用orm插入fromsqlalchemyimportcreate_enginefromsqlalch......
  • 多模块maven 打包异常
    聚合工程maven打包异常Non-resolvableparentPOMforxxx[WARNING]'version'containsanexpressionbutshouldbeaconstant.取消父工程版本中的属性值,替换成指定的常量<!--项目描述(异常)--><groupId>com.smile</groupId><artifactId>livechat</artifac......
  • 类装饰器
    类装饰器是什么用法defspeak():print('说话了')defwrapper(func):definnder(*args,**kwargs):res=func()res.name='moon'res.speak=speakreturnresreturninnder@wrapperclassUser:pa......
  • java11_Object类
    Object类相关JavaObject类是所有类的父类,也就是说Java的所有类都继承了Object,子类可以使用Object的所有方法。Object类位于java.lang包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承Object,成为Object的子类。内部结构:类的......
  • 基于FastICA算法的混合信号解混合信号恢复仿真
    1.算法描述       独立成分分析(IndependentComponentAnalysis,ICA)是近年来提出的非常有效的数据分析工具,它主要用来从混合数据中提取出原始的独立信号。它作为信号分离的一种有效方法而受到广泛的关注。近几年出现了一种快速ICA算法(FastICA),该算法是基于定点递推算法......
  • java 日志框架总结
    日志级别ALL<TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFFALL:最低等级的,用于打开所有日志记录。TRACE:designatesfiner-grainedinformationaleventsthantheDEBUG.Since:1.2.12,很低的日志级别,一般不会使用。DEBUG:指出细粒度信息事件对调试应用程序是非常有帮......
  • Bootstrap Blazor新增时带入选择的行内容
    1.需求如上图所示,字典表中字典类型和字典类型描述是重复的,新建时需要重复录入很不方便,所以需要从新增时从选中行带入到新建的文本框中。由于没有找到选中行事件的回调,所以采用其他方式处理。2.方案1.使用@bind-SelectedRows绑定选中行对象,开发中DictionaryDto替换为实......
  • PHP序列化与反序列化
    PHP反序列化学习参考资料可供新手学习的文章:《PHP反序列化新手入门学习总结》蚁景科技https://www.freebuf.com/articles/network/355848.html实战演练[SWPUCTF2021新生赛]考点wakeup()绕过解题思路如果类属性的数目大于正常数目则不会执行wakeup()函数<?phpheader......
  • m基于shepp-Logan模型和滤波反投影的医学图像多尺度全局重建和局部重建matlab仿真
    1.算法描述        从投影重建物体的截面图像是图像处理中非常重要的技术此技术在物体的无损伤性检测其内部缺陷的应用中能起很大作用从投影重建图像的技术早在20世纪中期就已经制成常规医疗诊断设备的商品1917年奥地利数学家J.Radon发表的论文证明了二维物体或三维物体......
  • 为啥我请求那里都写了异常捕获了,还是报这个错?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【喜靓仔】问了一个Python异常处理的问题,这里拿出来给大家分享下。二、实现过程这里粉丝给的信息十分有限,看问题其实还是挺难的,【论草莓如何成为冻干莓】给了一个指导。尝试进行断点定位问题:然后就找到了问题所在:这......