为什么当我们尝试创建一个单链表时,我们将类中的 Head 设为 NULL ,而不将 Head 的 Next 设为 Null 。在有关链表的函数中,为什么我们将节点的 Next 设为 Null,而不将 Node 设为 Null?
避免浪费。列表节点旨在存储其中的元素。想象一下,如果我们在您建议的场景中有一个空列表,其中
*
表示列表的头部。我们将从:开始
[*???]->NULL
其中
???
只是未使用元素的一些虚拟变量。当我们可以简单地这样做时,我们已经浪费了一个列表节点:
*NULL
同样,如果我们检查非空列表,我们可能会遇到您的情况:
[*123]->[456]->[789]->[???]->NULL
...当我们可以简单地拥有:
[*123]->[456]->[789]->NULL
当然,当列表大小从 0 变为 1 时,您可以对此进行扩充以覆盖此虚拟变量,但现在涉及额外的分支等,我们最终会得到更复杂的指令和处理开销。
因此,这样做实际上没有什么收获,而且可能会失去很多。
在有关链表的函数中,为什么我们要制作 Next of 节点为空而不使节点为空?
我不太明白这部分。例如,如果我们正在讨论向列表中插入一个新节点,我们可能会这样:
[new node: 456]->??? [*123]->NULL
然后我们让它指向头部:
[new node: 456]->[*123]->NULL
...然后让头指向新节点。
[*456]->[123]->NULL
因此,通常不应该将节点的下一个指针设置为空,除非它指向的头恰好为空,或者为了响应删除尾部。
这个想法是,当我们以相反的顺序显示链表的内容时,我们需要确保我们有一个特定的条件,通过这个条件我们可以验证链表迭代期间何时停止。这是一个简单的例子。
function displayReverse() {
var currNode = this.head;
currNode = this.findLast();
while (!(currNode.previous === null)) {
print(currNode.element);
currNode = currNode.previous;
}
}