[英]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
所以假设你有最后一个节点n
, n-1
(前一个节点)和p
(引用最后一个节点)指向它:
[n - 1] --> [n] <-- p
您的参考是p
。 你要删除节点n
,由p
指出。 如果将p
设置为null
,则不取消引用[n - 1]
指针。 这仍然指向[n]
节点。 因此,这意味着,节点[n]
并未真正与链接列表分离。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.