如果您的目标是编写一个函数来删除单链表中的节点,并且您只能访问要删除的节点(不是头部),为什么我的解决方案不起作用?
我的解决方案:
public void deleteNode(Node n) {
n = n.next;
}
Book的解决方案:
public void deleteNode(Node n) {
n.data = n.next.data;
n.next = n.next.next;
}
在我看来,只需将n分配给n.next就可以在一行中分配数据和指针。
答案 0 :(得分:2)
在获得关于链接列表操作的良好心理模型之前,这是一个容易犯的错误。 deleteNode
被赋予对要删除的节点的引用。它将此引用存储在变量n
中,该变量设置为 ,以便使用deleteNode
代码。在您的解决方案中,deleteNode
将n
的值更改为指向列表中的下一个节点,但这仅影响n
,一旦执行到达{{1}的末尾,该deleteNode
将被丢弃}。链接列表仍然与执行deleteNode
之前完全一样。换句话说,在您要删除的节点之前的节点仍然指向它在您输入deleteNode
时所执行的节点,并且应该删除的节点仍然指向该行中的下一个节点。更改n
无效。
答案 1 :(得分:1)
所有节点都在内存中的某个位置,每个节点都知道在哪里找到下一个节点
(独立于代码中的变量,即没有“n”或类似的东西)
此外,每个节点可以有一个或多个变量“指向”
到内存中的那个节点,你方法中的问题是,你只有
更改vriable n的目标,但不更改节点本身。
如果有4个节点的值为A,B,C,D且想要删除B,则变量n指向B.
在你的方法中赋值后,n将指向C,
但是4节点本身不会改变
书籍解决方案确实改变了B本身的价值......