为什么单链表中的 head 为空?

问题描述 投票:0回答:2

为什么当我们尝试创建一个单链表时,我们将类中的 Head 设为 NULL ,而不将 Head 的 Next 设为 Null 。在有关链表的函数中,为什么我们将节点的 Next 设为 Null,而不将 Node 设为 Null?

data-structures nodes singly-linked-list
2个回答
0
投票

避免浪费。列表节点旨在存储其中的元素。想象一下,如果我们在您建议的场景中有一个空列表,其中

*
表示列表的头部。我们将从:

开始
[*???]->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

因此,通常不应该将节点的下一个指针设置为空,除非它指向的头恰好为空,或者为了响应删除尾部。


0
投票

这个想法是,当我们以相反的顺序显示链表的内容时,我们需要确保我们有一个特定的条件,通过这个条件我们可以验证链表迭代期间何时停止。这是一个简单的例子。

function displayReverse() {
var currNode = this.head;
currNode = this.findLast();

while (!(currNode.previous === null)) {
    print(currNode.element);
    currNode = currNode.previous;
}

}

© www.soinside.com 2019 - 2024. All rights reserved.