双向链表(double linked list),又称双向链表,是一种特殊的数据结构,其中每个数据节点都包含两个指针,分别指向直接后继和直接前驱节点。因此,从双向链表中的任意一个节点开始,都可以方便地访问其前驱节点和后继节点。[1] 双向链表是一种线性数据结构,由头结点和多个包含数据域、前向指针域和后向指针域的结点组成。头结点的数据域可以存储线性表的长度等附加信息。双向链表中,每个结点的前向指针指向其直接前驱,后向指针指向其直接后继。双向循环链表是一种特殊的双向链表,其头结点的前向指针指向最后一个结点,后向指针指向第一个结点,最后一个结点的后向指针指向头结点。在双链表中,某些操作如ListLength,GetElem和LocateElem等只需要涉及一个方向的指针,因此它们的算法描述与单链表相同。然而,在插入和删除数据元素时,双链表需要同时修改两个方向上的指针,这与单链表有所不同。在进行双链表操作之前,需要先建立双链表。[2]
操作
线性表的双向链表存储结构:
typedef struct DuLNode