【问题标题】:Doubly Linked List delete last双向链表删除最后
【发布时间】:2015-11-23 23:36:00
【问题描述】:

我有对 head 和 lastNode 的引用。 嗨,我有一个问题。当我删除双向链表中的最后一个节点时,我是否必须将节点的先前引用设置为 null 或者我可以保留它。 删除lastNode时我会这样做。

lastNode = lastNode.prev; // lets lastNode reference the new last node
lastNode.next = null; // removes link to the old last node

当我执行 toString 方法时,它会按预期打印。只是想知道是否有必要将旧的最后一个节点 prev 设置为空。或者垃圾收集器是否会删除它,因为即使旧节点仍然有对链表中节点的引用,也没有对它的引用

【问题讨论】:

  • 确保您正在更新您的头指针,如果适用的话。

标签: java data-structures


【解决方案1】:

如果有任何方法可以访问新删除的 lastNode 对象,您只需要更新对 null 的引用。如果没有办法通过遍历列表到达该节点,那么您不必担心它。

不过,为了以防万一,做这种清理是个好习惯。

【讨论】:

  • 我敢说你绝对应该总是将新的 lastNode 的 next 指针设置为 null,因为它的指针应该正确地指向内存中正确的东西。将指向不存在的对象的指针留在内存中从根本上说没有意义(即使在任何一种情况下它都为空!)。
  • 我认为他的意思是删除的节点,而不是新的 lastNode。在双向链表中,他肯定必须更新仍然在列表中的节点的前一个和下一个引用。我指的是删除的节点。
  • 不添加新节点只是更新引用以从列表中删除最后一个节点。 lastNode 使用我提供的上述代码引用了倒数第二个节点。我在问天气是否重要,否则垃圾收集器无论如何都会删除它,因为这不再是对该节点的引用
  • GC 会收集 old-last-node,不管它是否指向 new-last-node。它所关心的只是旧的最后一个节点不可访问。这样做仍然是一个好习惯,例如,如果某些东西保留了对 old-last-node 的引用,那么如果已经执行了清理,那么在尝试遍历(向后)时,某些东西将彻底失败(NPE)。否则,您可能会遇到难以诊断的错误
猜你喜欢
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多