链表详解

链表是由一系列节点(链表中的每一个元素都叫作一个节点)组成的数据结构,节点可以在运行过程中动态生成。每个节点都包括两部分内容:存储数据的数据域;存储下一个节点地址的指针域。由于链表是随机存储数据的,因此在链表中插入数据的时间复杂度为O(1),比在线性表和顺序表中插入的效率要高;但在链表中查找一个节点时需要遍历链表中所有元素,因此时间复杂度为O(n),而在线性表和顺序表中查找一个节点的时间复杂度分别为O(logn)和O(1)。链表有3种不同的类型:单向链表、双向链表及循环链表。下面将以Java语言为基础分别介绍这3种不同的链表结构。4.3.1 链表的特点链表通过一组存储单元存储线性表中的数据元素,这组存储单元可以是连续的,也可以是不连续的。因此,为了表示每个数据元素与其直接后继数据元素之间的逻辑关系,对数据元素来说,除了存储其本身的信息,还需要存储直接后继数据元素的信息(即直接后继数据元素的存储位置)。由这两部分信息组成一个“节点”。链表数据结构的优点是插入快,缺点是数据查询需要遍历整个链表,效率慢。链表的具体数据结构如图4-3所示。

 

 链表根据具体的实现又分为单向链表、双向链表和循环链表。

 


单向链表(又称单链表)是链表的一种,其特点是链表的链接方向是单向的,访问链表时要从头部开始顺序读取。单向链表是链表中结构最简单的。一个单向链表的节点(Node)可分为两部分:第1部分为数据区(data),用于保存节点的数据信息;第2部分为指针区,用于存储下一个节点的地址,最后一个节点的指针指向null。具体的数据结构如图4-4所示。

 

 


 

在双向链表的每个数据节点中都有两个指针,分别指向其直接后继和直接前驱节点。所以,从双向链表中的任意一个节点开始,都可以很方便地访问它的直接前驱节点和直接后继节点。具体的数据结构如图4-7所示。

 

双向链表和单向链表的不同之处在于,单向链表除数据项外只定义了一个Next指针指向下一个节点,而双向链表定义了Prev和Next两个指针分别指向上一个节点和下一个节点,这样我们便可以从两个方向遍历并处理节点的数据了。


循环链表的链式存储结构的特点是:表中最后一个节点的指针域指向头节点,整个链表形成一个环。具体的数据结构如图4-8所示。

 

 循环节点的实现和单向链表十分相似,只是在链表中,尾部元素的Next指针不再是null,而是指向头部节点,其他实现和单向链表相同。

 

posted @ 2020-06-02 14:24  技术白菜  阅读(2)  评论(0)    收藏  举报