双链表
我们在前面的章节中介绍了单链表。
单链接列表中的结点具有 Value 字段,以及用于顺序链接结点的“Next”引用字段。
在本文中,我们将介绍另一种类型的链表:双链表。
定义
双链表以类似的方式工作,但还有一个引用字段,称为“prev”字段。有了这个额外的字段,您就能够知道当前结点的前一个结点。
让我们看一个例子:

绿色箭头表示我们的“prev”字段是如何工作的。
结点结构
下面是双链表中结点结构的典型定义:
struct DoubleListNode{ int val; DoubleListNode *prev,*next; DoubleListNode(int x):val(x),prev(NULL),next(NULL); };
添加操作 - 双链表
如果我们想在现有的结点 prev 之后插入一个新的结点 cur,我们可以将此过程分为两个步骤:
- 链接
cur与prev和next,其中next是prev原始的下一个节点;![]()
- 用
cur重新链接prev和next。![]()
与单链表类似,添加操作的时间和空间复杂度都是 O(1)。
示例

让我们在现有结点 6 之后添加一个新结点 9:
- 链接
cur(结点 9)与prev(结点 6)和next(结点 15)![]()
- 用
cur(结点 9)重新链接prev(结点 6)和next(结点 15)
如果我们想从双链表中删除一个现有的结点
cur,我们可以简单地将它的前一个结点prev与下一个结点next链接起来。与单链表不同,使用“prev”字段可以很容易地在常量时间内获得前一个结点。
因为我们不再需要遍历链表来获取前一个结点,所以时间和空间复杂度都是
O(1)。
示例

我们的目标是从双链表中删除结点 6。
因此,我们将它的前一个结点 23 和下一个结点 15 链接起来:

结点 6 现在不在我们的双链表中。




浙公网安备 33010602011771号