我有一个关于删除链表中心节点的快速问题,因为您只能访问该节点。我已经看了解决方案,虽然我理解发生了什么,但我对节点实际发生的事情感到困惑。例如,如果我的链接列表中的节点值为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;
}
}
答案 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;
答案 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->5
或1->2->
+ 4->5