为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 LinkedList 中删除中间节点?

如何从 LinkedList 中删除中间节点?

拉风的咖菲猫 2024-01-05 16:21:04
我试图从有权访问该节点的链表中删除中间节点。我想知道下面的两种方法是否有区别,或者它们完成相同的事情吗?public boolean deleteMiddle(Node middle){    Node next = middle.next; //line 2    middle.data = next.data;    middle.next = next.next;    return true;}public boolean deleteMiddle(Node middle){    middle.data = middle.next.data;    middle.next = middle.next.next;    return true;}第一种方法是教科书推荐的方法,但似乎在第一种方法(第 2 行)中创建“下一个”节点是不必要的代码行。
查看完整描述

3 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

我认为你可能是对的,它们是等价的(或者看起来确实是这样)

在这两种情况下,如果要删除的项目是列表中的最后一项(例如,如果 next 为 null,则 next.next 是错误),则看起来会出现空指针异常(在 next.next 上)。

如果你通过了 null,当然这也将成为 NPE。


查看完整回答
反对 回复 2024-01-05
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

在第一个方法(第 2 行)中创建节点“next”是不必要的代码行。

两个片段都达到相同的结果。

但是额外的变量赋值(它不会“创建节点”,它只是为现有节点分配一个新名称)所做的是避免调用middle.next两次,避免两次执行相同的“计算”。

在此示例中,这不会产生任何真正的区别,但一般来说,它可以是一种常见的性能优化,以避免冗余工作(特别是如果涉及执行一些“繁重工作”的方法调用)。不过,在进行这些冒险之前,应该考虑是否值得让代码变得不太易读,特别是考虑到 JVM 将尝试自动进行各种优化。因此,仅将这种心态应用于简单的模式或真正的瓶颈。

最重要的是,为中间结果命名也可以产生更多不言自明的代码(这里也没有太大区别)。

最后的评论:有时(但不是这里)有必要引入额外的变量来临时存储一些东西,否则这些东西会在操作过程中被覆盖,例如著名的int h = x; x = y; y = h;例子。


查看完整回答
反对 回复 2024-01-05
?
桃花长相依

TA贡献1860条经验 获得超8个赞

是的,它们是等价的。我更喜欢第一个,因为它避免了表达式的重复middle.next

正如@Rick 指出的,当middle是最后一个元素时,在这两种情况下你都会得到一个 NPE。


查看完整回答
反对 回复 2024-01-05
  • 3 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信