如何实现双向链表?

时间:2012-07-11 23:36:12

标签: c++ linked-list doubly-linked-list

我们学会了如何在课堂上实现单链表。我们的教授提到我们做了双重链表,但显然很容易,他真的没有详细解释如何做到这一点。我非常擅长处理单链表,但有人可以告诉我如何制作双重链表吗?

3 个答案:

答案 0 :(得分:7)

如果你已经有一个单链表的声音定义,那么双链表很容易。

在您可能有类似

之前
struct link{
  struct link* next; //a pointer to the node that comes next
  int value;
}

这需要更改为

struct link{
  struct link* next; //a pointer to the node that comes next
  struct link* prev; //a pointer to the node that comes before
  int value;
}

现在,您可以在遍历列表时使用previous而不是next来反向执行操作。

请记住,在添加或删除时,您需要小心处理“簿记”以确保正确的事情。

我总是告诉学生在编写函数时绘制添加和删除链表的每一步。并始终确保通过指针在某处保留对绘图中所有内容的引用,直到删除它为止。

答案 1 :(得分:3)

@kratenko有一个很好的观点,但为了便于访问,这里有一个简短的描述。

您的单一链接列表指向一个方向:

HEAD * - > |数据| - > |数据| - > |数据| - >空

对于双向链表,请在两个方向上实施单链表:

HEAD *< - > |数据| < - > |数据| < - > |数据| < - > TAIL *

其中HEAD *和TAIL *都是节点*成员指向它们的节点(在DoublyLinkedList类中)。

答案 2 :(得分:0)

你应该在头部和尾部添加“虚拟节点”。这将简化你的添加和删除方法(你不必考虑添加和删除头部和尾部,你只需要考虑“中间情况”)。

在配置程序之前,不要忘记用NULL替换虚拟节点。