删除单个链表中心的节点。节点会发生什么?

时间:2016-02-27 09:34:03

标签: javascript

我有一个关于删除链表中心节点的快速问题,因为您只能访问该节点。我已经看了解决方案,虽然我理解发生了什么,但我对节点实际发生的事情感到困惑。例如,如果我的链接列表中的节点值为1,2,3,4,5,为什么我会留下1,2,4,5而不是1,2,4,4,5?

提前感谢您的帮助。

SinglyList.prototype.deleteMiddle = function(value) {
    var current = this.head;
    while (current.value !== value) {
        current = current.next;
    }
    if (current.next) {
        current.value = current.next.value;
        current.next = current.next.next;
    } else {
        current = null;
    }
}

4 个答案:

答案 0 :(得分:2)

所以你有链接列表与节点1,2,3,4和5,从中删除节点3。删除节点3实际上是某些链接的重定向。在这种情况下,节点2将不再链接到节点3作为其下一个节点,但它将链接到节点4作为其下一个节点。在双向链表的情况下,反过来也是如此,例如,节点4将链接回节点2而不是节点3.

因此,节点3实际上不会被物理删除,但是对节点3的任何引用都将被删除,这意味着逻辑上它不再存在。在某个时间点,垃圾收集器将物理删除节点3,因为没有更多引用指向该节点。

答案 1 :(得分:1)

基本上,最后一个节点需要另一个变量。

如果不是在开始时,则将前一个下一个指针组合到实际的下一个指针:

lastNode.next = node.next;

工作模式:



function Node(value) {
    this.value = value;
    this.next = undefined;
}

function setValues(a) {
    var n = new Node(a.shift());
    if (a.length) {
        n.next = setValues(a);
    }
    return n;
}

function deleteNode(list, value) {
    var node = list,
        lastNode;
    while (node.value !== value) {     // find value
        lastNode = node;
        node = node.next;
    }
    if (lastNode) {                    // inside the list
        lastNode.next = node.next;
    } else {                           // at the start
        list.value = node.next.value;
        list.next = node.next.next;
    }
}

var list1 = setValues([1, 2, 3, 4, 5]);

document.write('<pre>' + JSON.stringify(list1, 0, 4) + '</pre>');
deleteNode(list1, 3);
document.write('<pre>' + JSON.stringify(list1, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我不确定这与JavaScript有什么关系,但您可以将链接列表视为一系列节点:

1 -> 2 -> 3 -> 4 -> 5

每个节点都有一个指向下一个节点的指针。删除3时,指针从2到3更新为指向3指向的(4)。所以你最终得到:

1 -> 2 -> 4 -> 5

如果你问如何删除它,如果你不能反过来看到2指向3,那么考虑如何遍历链表 - 只有一种方法可以去。因此,移除节点的算法将必须保持指向先前,当前和下一节点的指针。这样,当当前节点被移除(3)时,它可以查看先前的(2)和下一个(4)。当然3已经有4的引用所以下一个指针是不需要的。

答案 3 :(得分:0)

那里有多个链表实现。但是如果我们正在谈论抽象:如果你删除链表中的一个元素,它就会成为两个链表。一个在被移除的元素之前结束,第二个在被移除的元素之后开始。

节点会发生什么,这实际上意味着“删除”。删除的节点曾经是链接列表中没有“emtpy”空间。根据要求删除了它。根据remove操作的实现,可以组合两个结果列表的丢失端,形成一个(一个!)新的链表,1,2,4,5。或者他们不是,然后你最终描述了2个列表。列表1的结尾指向nil / null / somwhere,除非您将其保存在某处,否则对其他列表开头的引用将丢失。

所以你最终得到1->2->4->51->2-> + 4->5