繁体   English   中英

将LinkedList节点设置为null

[英]Setting LinkedList nodes to null

我之前在编码书中遇到过这个问题。

“实现一种算法来删除单链表中间的节点,只允许访问该节点。”

书中给出的解决方案是这样的:

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

当然,这是一个很好的解决方案,是O(1)。 不过,这本书最后指出了这一点。

“请注意,如果要删除的节点是链表中的最后一个节点,则无法解决此问题”。

我错过了一些明显的东西吗? 为什么我不能只是在主体之前检查方法,检查n.next是否等于null,如果是,只需将n设置为null并返回true? 有什么理由我不能这样做吗?

这段代码真正做的是将下一个节点复制到给定节点。 净效果就好像当前节点被删除一样,但实际上它只是被下一个节点覆盖了。

也就是说,你要删除此列表中的B

A -> B -> C -> D

结果列表如下所示:

                 +------+
A -> B(Ccopy) ---+   C -+-> D

现在,您无法对节点D执行此操作,因为没有要复制的下一个节点。

为什么我不能只是在主体之前检查方法,检查n.next是否等于null,如果是,只需将n设置为null并返回true? 有什么理由我不能这样做吗?

n设置为null将不会执行任何操作。 n只是对要删除的列表节点的引用。 如果更改n ,则实际上不会更改列表中的任何内容。 例如,假设您要在同一列表中删除D 它看起来像这样:

               n
               |
               v
A -> B -> C -> D

如果将n设置为null,则最终结果如下:

               n---> null


A -> B -> C -> D

请注意,列表中没有任何内容发生变化。

在这种情况下删除D的唯一方法是修改C.next指向null。 也就是说,你想要这个:

              +----> null
A -> B -> C --+ D

这需要修改C ,但在单链表中,你没有简单的方法从D访问C 您必须从列表的开头搜索,直到找到节点x ,使得x.next == D

所以假设你有最后一个节点nn-1 (前一个节点)和p (引用最后一个节点)指向它:

[n - 1] --> [n] <-- p

您的参考是p 你要删除节点n ,由p指出。 如果将p设置为null ,则不取消引用[n - 1]指针。 这仍然指向[n]节点。 因此,这意味着,节点[n]并未真正与链接列表分离。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM