链表是一种线性表数据结构,它通过指针将一组零散的内存块串(节点)连接在一起组成的存储结构。每个节点包含两部分内容:节点存储的数据和节点指向下一个节点的指针(next)。
每个节点通常包含两部分:
数据:保存与节点关联的实际值
指针:保存下一个节点的内存地址(引用)
链表的入口点称为表头,通过头节点访问链表,最后一个节点称为尾节点,指向null或者nullptr,表示列表的结束。
链表类型
单链表中每个节点包含了实际数据和下一个节点的引用,并且它只允许单向遍历整个链表。
单链表常用于:
内存管理,实现内存池,动态分配和回收
数据库索引,插入和删除
表示多项式和稀疏矩阵
操作系统,进程调度和管理系统资源
劣势:随机访问性能较差,数据丢失的脆弱性,不能用于并行处理。
双链表中每个节点包含了前一个和后一个节点的引用,允许向前或者向后两个方向遍历链表,但需要额外的内存用于向后引用。
双链表常用于:hash表,基于key高效存储和检索数据
劣势:消耗更多内存,访问元素更慢
循环链表中,最后一个节点指向第一个节点,循环列表可以是单向也可以是双向的。遍历循环列表时,可以从任意节点开始,并沿任意方向向前或向后比那里链表。
循环链表常用于:
资源分配,实现循环调度
播放歌曲或视频
缓存,固定大小的数据结构
循环队列
链表可以执行的操作
插入:向链表中添加新节点需要调整现有节点的指针,插入可以在链表的开始、结束或任何位置执行
删除:从链表中删除一个节点需要调整相邻节点的指针,以填补被删除节点留下的空白,删除可以在链表的开始、结束或任何位置执行
搜索:在链表中搜索一个特定的值需要从头节点开始遍历链表,直到找到该值或达到链表末尾
链表的优势:
动态扩容和收缩
插入和删除非常高效
结构灵活
链表的劣势:
随机访问:不能通过索引直接访问元素,需要遍历查找特定的值
额外内存:链表需要额外的内存存储指针。