链表可分为单项链表和双向链表,每一个元素称之为结点Node,物理存储单位上属于非连续、非顺序的存储结构。其中:
单项链表每个节点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域。记录下个结点地址的指针叫作后继指针next。链表中的某个节点是B,B的下一个节点为C,表示为B.next==C。查询操作的时候,只有在查询头节点的时候不需要遍历链表,时间复杂度是O(1)。查询其他节点时需要遍历链表,时间复杂度是O(n)。
插入和删除操作的时候,只有在添加和删除头节点的时候不需要遍历链表,时间复杂度是O(1),添加或删除其他结点需要遍历链表找到对应节点后,才能完成新增或删除节点,时间复杂度是O(n)。
而双向链表呢,它支持两个方向,每个结点不仅布置有一个后继指针next指向后面的节点,还有一个前驱指针prev指向前面的结点。相比单链表,双向链表需要额外的空间来存储前驱结点的地址。并且双向链表支持双向遍历,更加灵活。
对于查询操作,双向链表查询头尾节点的时间复杂度是O(1),平均的查询时间复杂度是O(n),给定节点找前驱结点的时间复杂度为O(1)。对于增删操作,头尾结点增删的时间复杂度为O(1),其他部分节点增删的时间复杂度是O(n),给定节点增删的时间复杂度为O(1)。