2014-12-30 37 views
3

实施例仅输入访问:从链表A-> B-> C-> D-> E中的节点的“C”结果:什么都没有返回,但新的链接列表看起来像a-> b-> d-> e实现一种算法,以删除在单个链接列表的中间的节点,给定到该节点

我明白,以前ppl已经问过这个问题了,但是由于我的声望还不够高,在那个线程中无法问我的问题。所以这里去我quesetion: 所以在溶液中,删除中间节点时,我们做的事:

public static boolean deleteNode(LinkedListNode n) { 
    if (n == null || n.next == null) { 
     return false; // Failure 
    } 
    LinkedListNode next = n.next; 
    n.data = next.data; 
    n.next = next.next; 
    return true; 
} 

但我不明白的是,为什么我不能只是做N =下一个? 这可能是一个微不足道的问题,但我似乎没有找到一个很好的解释这个问题

回答

1

在C++中,你写的代码是这样的:

bool deleteNode(LinkedListNode* n) { 
    if (n == null || (*n).next == null) { 
     return false; // Failure 
    } 
    LinkedListNode* next = (*n).next; 
    (*n).data = (*next).data; 
    (*n).next = (*next).next; 
    return true; 
} 

那么,是什么意思呢?当你调用这个方法,在C++中它应该是这样的:

LinkedListNode* listNode = new LinkedListNode(); 
deleteNode(&listNode); 

这一点很重要,因为这意味着你只需发送一个地址上,而不是整个对象。这意味着您实际上不能访问您作为该方法参数提供的节点,只能参考其地址。

基本上,在Java中,你不能这样做下面的C++代码:

*n = *next; 

您不能修改listNode对象的方法之外。你只能得到它的地址。而你只是修改其地址的副本,而不是地址本身。

基本上,这是因为在Java中,类的指针是按值传递(作为副本),和原语也按值传递(作为副本)。

+1

它在C++中的'bool',不是'布尔'数据类型,如本例中所述。一个小的更正。 – oya163

2

如果你只是做n = next,那么你只改变了什么对象在本地参考变量n指;你还没有修改列表的任何部分。

诀窍“删除”当前节点是与下一个的覆盖它:

n.data = next.data; 
n.next = next.next; 

n所指的对象,这是的一个部分的现在要修改的字段实际列表。

0

不知何故,它会覆盖当前节点,该节点应该被下一个节点的 数据删除,并删除下一个节点。

LinkedListNode next = n.next; 
n.data = next.data; 
n.next = next.next; 

这就是代码的来源。