链表是一种线性数据结构,其中元素不存储在连续的内存位置。链表中的元素使用指针链接,如下图所示:
链表在计算机科学中的应用——
- 栈和队列的实现
- 图的实现:图的邻接表表示是最流行的,它使用链表来存储相邻的顶点。
- 动态内存分配:我们使用空闲块的链表。
- 维护姓名目录
- 对长整数执行算术运算
- 通过在链表的节点中存储常量来操作多项式
- 表示稀疏矩阵
链表在现实世界中的应用——
- 图像查看器– 上一个和下一个图像是链接的,因此可以通过下一个和上一个按钮访问。
- Web 浏览器中的上一页和下一页– 我们可以通过按后退和下一页按钮访问在 Web 浏览器中搜索的上一页和下一页 url,因为它们被链接为链表。
- 音乐播放器 – 音乐播放器中的歌曲链接到上一首和下一首歌曲。您可以从列表的开头或结尾播放歌曲。
循环链表的应用:
- 用于队列的实现。与这个实现不同的是,如果我们使用循环链表,我们不需要维护前后两个指针。我们可以维护一个指向最后一个插入节点的指针,并且 front 总是可以作为 next of last 获得。
- 循环列表在应用程序中非常有用,可以重复遍历列表。例如,当 PC 上运行多个应用程序时,操作系统通常会将正在运行的应用程序放在一个列表中,然后循环遍历它们,给每个应用程序一段执行时间,然后让它们等待而 CPU 分配给另一个应用程序。操作系统使用循环列表很方便,这样当它到达列表的末尾时,它可以循环到列表的前面。
- 循环双向链表用于实现斐波那契堆等高级数据结构。
一个示例问题:
设计一个有效支持以下操作的数据结构。
- getMin : 获取最小值
- extractMin :删除最小值
- getMax : 获取最大值
- extractMax :删除最大值
- insert :插入一个项目。可以假设到目前为止插入的项目总是大于最大值。例如,有效的广告订单是 10、12、13、20、50。
双向链表是这里最好的解决方案。我们维护头指针和尾指针,因为插入的项目总是最大的,我们在尾插入。从头部或尾部删除一个项目可以在 O(1) 时间内完成。所以所有操作都需要 O(1) 时间。
最近关于链表的文章
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。