链表:我们如何判断使用虚拟节点是否是绝对必要的



我正在复习CS基础知识
我有一个关于链表的问题。

在某些情况下,使用虚拟节点(主要在列表的开头)来帮助实现。

我发现,如果它丢失了(即,如果遵循了一种不使用虚拟节点的方法),代码就会变得"混乱"(至少我做得很混乱,因为我对这些东西很生疏…)

我想知道是否存在这样的情况:如果不使用伪节点,就不可能求解算法
你能举个例子吗?

手头的问题是否有特定的特征表明,虚拟节点是唯一的出路?

注意:我不标记特定的语言,只是为了以防万一我更喜欢Java

不,没有任何算法在没有虚拟节点的情况下是不可能的,它只是为了方便和保持代码干净。如果没有虚设,则必须特别考虑,例如在删除链表的最后一个节点或遍历空链表时–在这些情况下,dummy充当哨兵,使遍历和移除的核心算法更简单。

有一个伪节点(在某些文本中称为sentinel)的优点是不再需要检查列表中的null元素,在某种程度上,它是null对象模式的一个实例,使某些算法的实现更简单。

除此之外,使用任何一种实现(有或没有虚拟节点)都可以解决的算法不会有任何差异。例如,Oracle对LinkedList类的实现使用了一个伪节点,但其他供应商可以自由编写该类的无伪版本,因为这是一个对外部世界没有任何影响的实现细节。

如果没有某种明确标记列表末尾的方法,就不可能明确解释嵌套列表。看:为什么我们需要"nil"?

当然,您可以通过保留指向某个节点的指针来检查该节点是否为最终节点,但这在很大程度上是没有吸引力的,因为它效率低下。

相关内容

  • 没有找到相关文章

最新更新