数据结构 - 什么是链表?
1、数组的局限性
数组是内存上连续的数据结构,因此其各操作的时间复杂度为:
-
查找:O(1)
-
插入:O(n)
-
删除:O(n)
可以看到其插入和删除因为需要移动大量元素,导致了其线性的时间复杂度O(n)。
2、数组的改进---链表
为了降低对集合元素(数组)进行插入、删除操作时的时间复杂度,前人提出了链表的概念。
链表其各操作的时间复杂度为:
-
查找:O(n) 【因为底层空间不连续,不支持随机访问】
-
插入:O(1)
-
删除:O(1)
1)链表的定义
链表是物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,由一系列可动态生成的结点(地址)组成。
2)链表的组成
(a)存储数据元素的数据域(内存空间)
(b)存储指向下一个结点地址的指针域
struct node
{
int data;//存放数据
struct node *next; //地址域(与节点的类型地址相匹配)
}
3)链表的类型
a)单向链表(每个节点包含当前值和指向下一个节点的链接)【适用于节点的增加、删除】
b)双向链表(每个节点包含当前值、指向前一个节点链接和指向后一个节点链接)【适用于需要双向查找节点值的情况】
c)循环链表(头节点和尾节点被连接在一起的链表,第一个节点之前就是最后一个节点,单向和双向皆可实现)
4)应用场景
适合任意位置插入和删除比较频繁的场景。
5)链表和顺序表的比较
6)链表和数组的比较
需要快速访问数据,很少插入和删除元素,就用数组;
需要插入和删除元素(修改元素中的指针即可),就用链表。
3、跳表的提出
为了解决链表查找操作为O(n)的问题。
其实基本思路也很好理解,链表的问题是查找一个元素时必须要从头节点遍历到链表尾,每次只根据节点的指向下一个节点的链接跳跃一步,那么可以用哪种方式使得链表在遍历查找过程中每次跳跃多步呢?
这就引出了跳表的定义。跳表是如何提高链表线性查找的效率呢?将一维线性结构转变为多维结构,查看实现原理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」