> For the complete documentation index, see [llms.txt](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/05.0/05.6.md).

# 05.6 Go 语言中的双向链表

**双向链表**中的每个节点都既有指向前一个元素的指针，又有指向下一个元素的指针。

双向链表形如下图：

![](https://2544064347-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LW1CVykBZtj4q8ChPkq%2F-LelHcf7dqeA4HFZyDbC%2F-LelHrqzZIip4k6fai7x%2F05.6-1.jpg?generation=1557752688478732\&alt=media)

因此，在一个双向链表中，第一个节点的后链接指向第二个节点，而它的前链接指向 `nil`（也称为 **NULL**）。类似的，最后一个节点的后链接指向 `nil`，而它的前链接指向双向链表中的倒数第二个节点。

本章的最后一个插图阐明了双向链表中增加节点的操作。可想而知，这个过程中的主要任务是处理新节点、新节点左侧节点、新节点右侧节点这三个节点的指针。

![](https://2544064347-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LW1CVykBZtj4q8ChPkq%2F-LelHcf7dqeA4HFZyDbC%2F-LelHrr1LKONzBFpDGyX%2F05.6-2.jpg?generation=1557752686260169\&alt=media)

所以，单向链表和双向链表的主要区别实际上只是双向链表的操作更冗杂。这是你为了能够从两个方向都能访问双向链表所必须付出的代价。
