实现一种算法来删除单个链表中间的节点,仅授予对该节点的访问权限



示例输入:链表中的节点"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;

代码就是这样来的。

最新更新