图解数据结构(02) -- 链表

本文详细介绍了链表这一数据结构,包括单向链表和双向链表的概念,链表的存储方式,以及查找、更新、插入和删除等基本操作。链表与数组在内存存储和操作性能上的对比也进行了讨论,帮助理解两者适用场景。
摘要由CSDN通过智能技术生成

1、什么是链表

单向链表

链表(linkedlist)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成;单向链表的每一个节点又包含两部分,一部分是存放数据的变量 data,另一部分是指向下一个节点的指针 next
结构图:
单向链表
代码实现:

    private static class Node {
   
        int data;
        Node next;
    }

链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的 next 指针指向空;
与数组按照下标来随机寻找元素不同,对于链表的其中一个节点A,只能根据节点A的 next 指针来找到该节点的下一个节点B,再根据节点B的next指针找到下一个节点C……一级一级,单线传递!想让每个节点都能回溯到它的前置节点,可以使用双向链表

双向链表

双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指 针,还拥有指向前置节点的prev指针;
在这里插入图片描述

链表的存储方式

说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储
数组在内存中占用了连续完整的存储空间,而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠 next 指针关联起来,这样可以灵活有效地利用零散的碎片空间。

  • 数组的内存分配方式图:
    数组的内存分配方式
  • 链表的内存分配方式图:
    链表的内存分配方式
    图中的箭头代表链表节点的 next 指针

2、链表的基本操作

【1】查找节点

在查找元素时,链表不像数组那样可以通过下标快速进行定位,只能从头节点开始向后一个一个节点逐一查找。
例如给出一个链表,需要查找从头节点开始的第3个节点:
在这里插入图片描述
查找步骤:

  • 第1步,将查找的指针定位到头节点
    在这里插入图片描述
  • 第2步,根据头节点的next指针,定位到第2个节点
    在这里插入图片描述
  • 第3步,根据第2个节点的next指针,定位到第3个节点,查找完毕
    在这里插入图片描述

链表中的数据只能按顺序进行访问,最坏的时间复杂度是O(n)

【2】更新节点

如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可
在这里插入图片描述

【3】插入节点

链表插入节点时,分为3种情况:

  • 尾部插入
    尾部插入把最后一个节点的next指针指向新插入的节点即可
    尾部插入
  • 头部插入
    头部插入可以分成两个步骤:
    第1步,把新节点的next指针指向原先的头节点
    第2步,把新节点变为链表的头节点
    在这里插入图片描述
  • 中间插入
    中间插入同样分为两个步骤:
    第1步,新节点的 next 指针,指向插入位置的节点
    第2步,插入位置前置节点的 next 指针,指向新节点
    在这里插入图片描述
    只要内存空间允许,能够插入链表的元素是无穷无尽的,不需要像数组那样考虑扩容的问题

【4】删除元素

链表的删除操作同样分为3种情况:

  • 尾部删除
    尾部删除把倒数第2个节点的 next 指针指向空即可:
    在这里插入图片描述
  • 头部删除
    头部删除把链表的头节点设为原先头节点的next指针即可:
    在这里插入图片描述
  • 中间删除
    中间删除把要删除节点的前置节点的 next 指针,指向要删除元素的下一个节点即可:
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值