2015-09-20 99 views
1

所以我们可以说我们有这个链表: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? 
} 

谢谢!

回答

0

认识到的重要一点是,第一个代码实际上并没有“删除节点‘d’”(好像是这个名字所暗示的),而是删除 d。

它通过将下一个节点(示例中的“f”)的值复制到当前节点(之前包含“d”的节点),然后删除下一个节点(包含“f” ),因为我们有当前节点中的值的副本,所以不再需要它。

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

我觉得有点混乱,我个人会直接删除节点“d”,而不移动任何内容。我想,这样做是为了更好地分离节点搜索和删除。如果您实际上想要删除某个节点(而不是其内容),则需要参考其之前的节点节点。这可能会使界面复杂化。

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