如何从LinkedList删除中间节点?

问题描述 投票:1回答:3

我正在尝试从具有访问权限的链表中删除中间节点。我想知道下面两种方法之间是否有区别,或者它们完成相同的事情?

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行)中创建节点“ next”是不必要的代码行。

java singly-linked-list
3个回答
1
投票

[我认为您可能认为它们是等效的(或者看起来确实是这样)

[在两种情况下,如果您要删除的项目是列表中的最后一个(例如,如果next为null,则next.next都是错误),这似乎是null指针异常(在next.next上)。

当然,如果您通过null,那也将是NPE。


0
投票

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

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


0
投票

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

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

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

在此示例中,没有任何实际的区别,但是通常,通常可以进行性能优化,以避免多余的工作(尤其是如果涉及到的方法调用执行一些“繁重的工作”)。

最重要的是,给中间结果命名也可能导致更多不言自明的代码(这里也没有太大区别)。>>

© www.soinside.com 2019 - 2024. All rights reserved.