从单链表中删除节点

时间:2014-02-20 00:09:44

标签: linked-list

如果您的目标是编写一个函数来删除单链表中的节点,并且您只能访问要删除的节点(不是头部),为什么我的解决方案不起作用?

我的解决方案:

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就可以在一行中分配数据和指针。

2 个答案:

答案 0 :(得分:2)

在获得关于链接列表操作的良好心理模型之前,这是一个容易犯的错误。 deleteNode被赋予对要删除的节点的引用。它将此引用存储在变量n中,该变量设置为 ,以便使用deleteNode代码。在您的解决方案中,deleteNoden的值更改为指向列表中的下一个节点,但这仅影响n,一旦执行到达{{1}的末尾,该deleteNode将被丢弃}。链接列表仍然与执行deleteNode之前完全一样。换句话说,在您要删除的节点之前的节点仍然指向它在您输入deleteNode时所执行的节点,并且应该删除的节点仍然指向该行中的下一个节点。更改n无效。

然而,这本书的解决方案确实改变了一些东西。在它运行之后,应该被删除的节点现在包含数据和下一个指针,该指针来自下一个节点。这有效地将下一个节点的内容“移位”一个。

答案 1 :(得分:1)

所有节点都在内存中的某个位置,每个节点都知道在哪里找到下一个节点
(独立于代码中的变量,即没有“n”或类似的东西) 此外,每个节点可以有一个或多个变量“指向” 到内存中的那个节点,你方法中的问题是,你只有 更改vriable n的目标,但不更改节点本身。

如果有4个节点的值为A,B,C,D且想要删除B,则变量n指向B. 在你的方法中赋值后,n将指向C,
但是4节点本身不会改变 书籍解决方案确实改变了B本身的价值......