数据结构 - 什么是链表?

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)的问题。

  其实基本思路也很好理解,链表的问题是查找一个元素时必须要从头节点遍历到链表尾,每次只根据节点的指向下一个节点的链接跳跃一步,那么可以用哪种方式使得链表在遍历查找过程中每次跳跃多步呢?

  这就引出了跳表的定义。跳表是如何提高链表线性查找的效率呢?将一维线性结构转变为多维结构,查看实现原理

posted @   李若盛开  阅读(250)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示