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

时间:2014-12-30 06:54:57

标签: java singly-linked-list

示例输入:链接列表中的节点“c”a-> b-> c-> d-> e结果:没有返回任何内容,但新链接列表看起来像a-> b - > D-&GT,E

我知道ppl之前已经问过这个问题,但由于我的声誉还不够高,我无法在那个帖子中提出我的问题。所以这里是我的决定: 所以在解决方案中,删除中间节点时我们会这样做:

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

但我不明白的是,为什么我不能做n = next? 这可能是一个微不足道的问题,但我似乎没有找到这个问题的一个很好的解释

3 个答案:

答案 0 :(得分:2)

如果您只是n = next,那么您只更改了本地引用变量n所指的对象;你还没有修改过列表的任何部分。

“删除”当前节点的技巧是用下一个节点覆盖它:

n.data = next.data;
n.next = next.next;

现在您要修改n引用的对象的字段,这是实际列表的一部分。

答案 1 :(得分:1)

在C ++中,您编写的代码如下所示:

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

那是什么意思?当你调用这个方法时,在C ++中它看起来像这样:

LinkedListNode* listNode = new LinkedListNode();
deleteNode(&listNode);

这很重要,因为这意味着您只是发送一个地址,而不是整个对象。这意味着您实际上无法访问您作为方法参数提供的节点,您只能引用其地址。

基本上,在Java中,您无法执行以下C ++代码:

*n = *next;

您无法修改方法之外的listNode对象。你只能得到它的地址。而您只是修改其地址的副本,而不是地址本身。

基本上,这是因为在Java中,类的指针是通过值传递的(作为副本),而原语也是通过值传递的(作为副本)。

答案 2 :(得分:0)

以某种方式,它覆盖了应该删除的当前节点 下一个节点的数据,并删除下一个节点。

LinkedListNode next = n.next;
n.data = next.data;
n.next = next.next;

这就是代码的来源。