示例输入:链接列表中的节点“c”a-> b-> c-> d-> e结果:没有返回任何内容,但新链接列表看起来像a-> b - > D-&GT,E
我知道ppl之前已经问过这个问题,但由于我的声誉还不够高,我无法在那个帖子中提出我的问题。所以这里是我的决定: 所以在解决方案中,删除中间节点时我们会这样做:
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 = next? 这可能是一个微不足道的问题,但我似乎没有找到这个问题的一个很好的解释
答案 0 :(得分:2)
如果您只是n = next
,那么您只更改了本地引用变量n
所指的对象;你还没有修改过列表的任何部分。
“删除”当前节点的技巧是用下一个节点覆盖它:
n.data = next.data;
n.next = next.next;
现在您要修改n
引用的对象的字段,这是实际列表的一部分。
答案 1 :(得分: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中,类的指针是通过值传递的(作为副本),而原语也是通过值传递的(作为副本)。
答案 2 :(得分:0)
以某种方式,它覆盖了应该删除的当前节点 下一个节点的数据,并删除下一个节点。
LinkedListNode next = n.next;
n.data = next.data;
n.next = next.next;
这就是代码的来源。