示例输入:链表中的节点"c"a->b->c->d->e 结果:不返回任何内容,但新的链表看起来像 a->b->d->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?这可能是一个微不足道的问题,但我似乎没有找到这个问题的好解释
如果你只是n = next
,那么你只更改了你的局部引用变量n
引用的对象;你没有修改列表的任何部分。
"删除"当前节点的诀窍是用下一个节点覆盖它:
n.data = next.data;
n.next = next.next;
现在,您正在修改由 n
引用的对象的字段,这是实际列表的一部分。
在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 中,类的指针是按值传递的(作为副本),而原语也是按值传递的(作为副本)。
知何故,它会覆盖应该用下一个节点的数据,并删除下一个节点。
LinkedListNode next = n.next;
n.data = next.data;
n.next = next.next;
代码就是这样来的。