2

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

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

4

3 回答 3

1

我认为您可能是对的,它们是等效的(或者肯定是那样的)

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

如果你通过 null 当然这也将是一个 NPE。

于 2019-10-28T06:36:54.480 回答
0

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

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

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

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

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

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

于 2019-10-28T07:21:39.697 回答
0

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

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

于 2019-10-28T06:45:15.067 回答