java - 链表从某个位置困惑中删除节点

标签 java data-structures linked-list

假设我们有这个链表:a-> s-> d -> f,我们想删除 d。

我无法理解为什么下面的代码正确地从链接列表中删除了一个项目,以及为什么下面的代码没有产生相同的结果?

正确代码:

public void deleteNode(ListNode node) {
    node.val = node.next.val;
    node.next = node.next.next;
 }

代码错误:

 public void deleteNode(ListNode node) {
        node = node.next;//d now points to f
        //So wouldn't node s.next now equal f 
        //because we have changed what node d references to? 
 }

谢谢!

最佳答案

要认识到的重要一点是,第一个代码实际上并不是“删除节点'd'”(如名称所示),而是删除 d。

它通过将值从下一个节点(示例中的“f”)复制到当前节点(之前包含“d”的节点),然后删除下一个节点(包含“f”的节点)来实现这一点,这不再是必需的,因为我们在当前节点中有该值的副本。

a -> s -> d -> f
a -> s -> f -> f
a -> s -> f

我觉得有点困惑,我个人会直接删除节点“d”,而不移动任何内容。我想,这样做是为了更好地将节点搜索和删除分开。如果您确实想要删除某个节点(而不是其内容),则需要对其前一个节点的引用。这可能会使界面变得复杂。

第二个代码正是因为这个问题而失败。它尝试删除给定的节点 - 但它不能,因为删除它意味着更新前一个节点的 .next 成员,而我们无权访问该节点。错误代码中的语句只是更改了本地变量中的引用,这对实际列表没有任何影响。

关于java - 链表从某个位置困惑中删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32674416/

相关文章:

java - JRE系统库中每个jar的作用

java - 以毫秒为单位的自定义日期和时间字符串

java - 同步方法和 block 之间有什么区别?

java - 循环单链表

java - 在 netty ChannelBuffer 中搜索字符串的最佳方法(无需创建新字符串)?

java - 保持项目排序的集合数据结构

python - J的x型变量: how are they stored internally?

algorithm - 如何轻松记住红黑树的插入和删除?

c - 按升序插入单链表

c++ - 如何向链表中的节点插入多个值