我们正在尝试编写一种方法来从 LUT 的链表实现中删除具有特定键的节点。
我写的代码总结:
public void delete (String k) {
Node currNode = listHead;
Node prevNode = listHead;
Key key = new Key (k);
while (!currNode.key.equals(k) && currNode != null){
prevNode = currNode;
currNode = currNode.next;
}
if (currNode == listHead) {
listHead = listHead.next;
} else {
prevNode.next = currNode.next;
}
}
我的朋友写了基本相同的东西,但没有使用以前的节点指针,而是写在他的最后一行:
currNode = currNode.next //detach point, override
这两个是等价的吗?我想我对 Java 内存管理感到困惑。
如果您已经在listHead
其他地方创建了节点,并且您编写:
Node currNode = listHead;
currNode
只是存储对存储位置的内存位置的引用listHead
,对吗?因此,当您这样做时,在 while 循环中,您要做currNode = currNode.next
的是转到引用的内存位置currNode
并查看变量 next 并将对该内存位置的引用存储在currNode
? 所以基本上更新currNode
指向的地方。这意味着我朋友的代码是错误的,对吧?因为他的代码同样意味着:“currNode
用”的内存位置更新当前的引用currNode.next
。
有人介意帮我除雾吗?