假设我们有这个链表: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/