如何从 LinkedList 中删除中间节点?
How do I delete the middle node from a LinkedList?
我正在尝试从链接列表中删除中间节点,以便访问该节点。我想知道下面两种方法之间是否有区别,或者它们完成的是同一件事?
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" 似乎是不必要的代码行。
我认为你可能是对的,它们是等价的(或者看起来确实是这样的)
在这两种情况下,如果您要删除的项目是列表中的最后一项(例如,如果下一个为空,则 next.next是一个错误)。
如果你通过了 null 当然那也将是一个 NPE。
是的,它们是等价的。我更喜欢第一个,因为它避免了表达式 middle.next
.
的重复
正如@Rick 指出的那样,当 middle
是最后一个元素时,在这两种情况下你都会得到一个 NPE。
creating the Node "next" in the first method(line 2) is an unnecessary line of code.
两个代码段都获得相同的结果。
但是额外的变量赋值(它没有 "create a Node",它只是为现有变量分配一个新名称)所做的是避免调用 middle.next
两次,避免做同样的事情 "calculation"两次。
在此示例中,这不会产生任何实际影响,但一般来说,它可以是一种常见的性能优化,以避免冗余工作(特别是如果涉及执行某些操作的方法调用 "heavy lifting")。不过,在进行这些冒险之前,应该考虑一下是否值得让代码的可读性可能降低一些,尤其是考虑到 JVM 会尝试自动进行各种优化。因此,仅将这种思维方式应用于简单模式或真正的瓶颈。
最重要的是,为中间结果命名也可以导致更多的不言自明的代码(这里也没有太大区别)。
结语:有时(但不是这里)有必要引入额外的变量来临时存储一些东西,否则这些东西会在操作过程中被覆盖,比如著名的int h = x; x = y; y = h;
例子。
我正在尝试从链接列表中删除中间节点,以便访问该节点。我想知道下面两种方法之间是否有区别,或者它们完成的是同一件事?
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" 似乎是不必要的代码行。
我认为你可能是对的,它们是等价的(或者看起来确实是这样的)
在这两种情况下,如果您要删除的项目是列表中的最后一项(例如,如果下一个为空,则 next.next是一个错误)。
如果你通过了 null 当然那也将是一个 NPE。
是的,它们是等价的。我更喜欢第一个,因为它避免了表达式 middle.next
.
正如@Rick 指出的那样,当 middle
是最后一个元素时,在这两种情况下你都会得到一个 NPE。
creating the Node "next" in the first method(line 2) is an unnecessary line of code.
两个代码段都获得相同的结果。
但是额外的变量赋值(它没有 "create a Node",它只是为现有变量分配一个新名称)所做的是避免调用 middle.next
两次,避免做同样的事情 "calculation"两次。
在此示例中,这不会产生任何实际影响,但一般来说,它可以是一种常见的性能优化,以避免冗余工作(特别是如果涉及执行某些操作的方法调用 "heavy lifting")。不过,在进行这些冒险之前,应该考虑一下是否值得让代码的可读性可能降低一些,尤其是考虑到 JVM 会尝试自动进行各种优化。因此,仅将这种思维方式应用于简单模式或真正的瓶颈。
最重要的是,为中间结果命名也可以导致更多的不言自明的代码(这里也没有太大区别)。
结语:有时(但不是这里)有必要引入额外的变量来临时存储一些东西,否则这些东西会在操作过程中被覆盖,比如著名的int h = x; x = y; y = h;
例子。