难以从概念上理解此链接列表代码

时间:2018-01-29 21:57:57

标签: java algorithm linked-list

我无法理解为什么下面的函数delete()可用于删除链表中的节点。我删除了剩下的代码,使这一切更容易阅读。

所以,我知道我们有一个节点first,其中有一堆节点链接到first。我也理解在delete()函数中,我们需要创建一个新节点n来遍历列表。这是我的挂断:

如果我们创建一个新节点n并设置n = first,我们就创建了一个新节点,节点构造函数定义n将有一个新节点{{1也是。那么,我们还没有创建一个全新的列表,与以n.next开头的列表分开?当first函数到达设置delete()的点时,是不是删除了n.next = n.next.next个节点的完整单独列表中的节点?这是如何删除n链接的节点的?从概念上讲,这是我的挂断。

我们如何实际删除列表中以first开头的节点?

编辑:我想也许我回答了自己的问题,但我希望有人可以验证。这是否有效,因为firstfirst节点实际上只是引用回n函数中创建的New Node()对象?当我学习编程时,它是使用C ++,所以我习惯于看到指针,这段代码没有多大意义;但据我所知,Java并没有明确指出......所以我对所有这些都是正确的吗?

Add()

1 个答案:

答案 0 :(得分:2)

这是因为每个链接列表节点只包含对象的引用和对下一个节点的引用。要删除节点,只需要让前一个节点指向它之后的节点即可。

即。初步清单:

linkedList
  ↓
node0 -> node1 -> node2 -> node3

1)如果你要删除node1,那么它看起来像这样

linkedList
  ↓
node0 ----------> node2 -> node3
         node1 ----↑

node0将不再指向node1,因此如果您尝试从node0进行迭代,则接下来转到node2。但是,node1仍会“指向”node2(当然,直到它被垃圾收集)。

2)如果你改为删除node0,它看起来像这样:

       linkedList
           ↓
node0 -> node1 -> node2 -> node3

您只需移动first的{​​{1}}字段即可指向LinkedList,因此,如果您要执行node1,则需要访问linkedList.first node1 }。但是node0最终会收集垃圾,因为没有引用它(除非你在其他地方这样做)。

请记住,这些情况适用于单链接的LinkedList。如果你有一个双重链接的LinkedList,那么分离和重新连接会变得有点复杂。

-

我认为你对“删除”的含义有误解。在Java中,用户不会手动管理内存,因此您不会调用mallocdeletedestroy等。您只需删除对该对象的所有引用,它们最终将获得JVM收集的垃圾。

在上面的代码中,我们只是在谈论从数据结构方面的Node“删除”LinkedList