在讨论使用链接列表实现的字典时,这来自“算法设计手册”。
首先,使用“插入时检查last->next
是否仍然等于NULL”的部分。为什么我们要检查?如果我插入一个元素,那将如何影响最后一项正确指向NULL?如果我们正确地执行我们的实现,不应该已经吗?我们不能只说出类似的内容:
last->next = nodeToInsert;
last = last->next;
为什么不起作用?
其次,第二段是关于我们删除单链表中的最后一项并且必须识别新的最后一项的情况?而且我们只是(具有O(n)复杂度)遍历第二个最后一项并将其设置为持续并删除前一个项目?我们将它与预先存在的删除方法混合,只是添加一个案例,如果它是最后一项?
答案 0 :(得分:3)
我们为什么要检查?
因为大概你并不总是在列表末尾插入,所以last
并不总是需要更新。
其次,......
是
答案 1 :(得分:1)
请注意,本节讨论的字典是作为排序列表实现的。
这意味着插入需要在恰当的位置进行。 您建议的代码添加到列表的末尾:
last->next = nodeToInsert;
last = last->next;
这对于未排序的列表是正确的,但不适用于排序。
另请注意,作者使用last作为普通链表的附加指针。
我认为你相信最后是双重链表结构的一部分。如果是这样,那么你应该在插入过程中更新它是正确的。但是,由于它是一个独立的指针,因此需要在文本中描述的附加代码使其与链表保持一致。
答案 2 :(得分:0)
if(last->next != NULL) { // insertion occurred at the tail end
last = nodeToInsert; // so update tail pointer to point to inserted node
}
尾端插入已设置last->next
。由于插入,它不再是NULL
。这就是告诉我们last
需要更新的信息(last
现在实际上是lastButOne
)。如果last->next
仍为NULL
,那么我们无需执行任何操作,因为插入发生在last
之前的某处。你的书的措辞可能有点误导。这现在有意义吗?