双链表

  简介 - 双链表

我们在前面的章节中介绍了单链表。

单链接列表中的结点具有 Value 字段,以及用于顺序链接结点的“Next”引用字段。

在本文中,我们将介绍另一种类型的链表:双链表

 

定义


双链表以类似的方式工作,但还有一个引用字段,称为“prev”字段。有了这个额外的字段,您就能够知道当前结点的前一个结点。

让我们看一个例子:

绿色箭头表示我们的“prev”字段是如何工作的。

 

结点结构


下面是双链表中结点结构的典型定义:

struct DoubleListNode{
    int val;
    DoubleListNode *prev,*next;
    DoubleListNode(int x):val(x),prev(NULL),next(NULL);

};

 

添加操作 - 双链表

如果我们想在现有的结点 prev 之后插入一个新的结点 cur,我们可以将此过程分为两个步骤:

  1. 链接 cur 与 prev 和 next,其中 next 是 prev 原始的下一个节点;
  2. 用 cur 重新链接 prev 和 next

与单链表类似,添加操作的时间和空间复杂度都是 O(1)

 

 

示例


让我们在现有结点 6 之后添加一个新结点 9:

  1. 链接 cur(结点 9)与 prev(结点 6)和 next(结点 15)
  2. 用 cur(结点 9)重新链接 prev(结点 6)和 next(结点 15)

    如果我们想从双链表中删除一个现有的结点 cur,我们可以简单地将它的前一个结点 prev 与下一个结点 next 链接起来。

    与单链表不同,使用“prev”字段可以很容易地在常量时间内获得前一个结点。

    因为我们不再需要遍历链表来获取前一个结点,所以时间和空间复杂度都是O(1)

示例


我们的目标是从双链表中删除结点 6。

因此,我们将它的前一个结点 23 和下一个结点 15 链接起来:

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

posted @ 2019-11-18 09:58  任仁人  阅读(51)  评论(0)    收藏  举报