[英]Linked List removing a node from certain position confusion
假设我们有以下链接列表: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
成员,而我们无权访问。 错误代码中的语句仅更改了局部变量中的引用,这对实际列表没有任何影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.