我们学会了如何在课堂上实现单链表。我们的教授提到我们做了双重链表,但显然很容易,他真的没有详细解释如何做到这一点。我非常擅长处理单链表,但有人可以告诉我如何制作双重链表吗?
答案 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替换虚拟节点。