我正在解决Hackerrank问题,我正在尝试删除所有大于特定值的节点。
这是他们的基本实现
const SinglyLinkedListNode = class{
constructor(value) {
this.value = value;
this.next = null;
}
};
const SinglyLinkedList = class {
constructor() {
this.head = null;
this.tail = null;
}
insertNode(value) {
const node = new SinglyLinkedListNode(value);
if(!this.head) {
this.head = node;
} else {
this.tail.next = node;
}
this.tail = node;
}
};
我删除节点的功能如下...
SinglyLinkedList.prototype.removeNodes = function(listHead, x){
let currentNode = listHead;
while(currentNode !== null && currentNode.next !== null) {
let next = currentNode.next;
while (next !== null && next.value > x) {
next = next.next
}
currentNode.next = next
if(currentNode.next === null) {
break;
}
}
return currentNode
}
参数包括:listhead - 对根节点的引用,x - 用于过滤链表的整数值
例如,LL 是 1-> 2 -> 4 -> 3-> 5,我需要删除所有大于 x (3( 的节点并保持 LL 顺序的完整性。 结果应为 1 -> 2 -> 3。
我对为什么我一直得到这个.tail.value = 5而不是 this.tail.value = 3, this.tail.next = null。
这是一个 REPL
因为必须显式重写tail
,否则它会保留对未链接节点的引用。在运行函数之前,列表如下所示:
list: head tail
1 -> 2 -> 3 -> 4 -> 5
之后尾巴仍然指向 5,尽管这是未链接的:
list: head tail
1 -> 2 -> 3 5
要解决此问题,只需重写函数末尾的尾部:
return this.tail = currentNode;
此外,您还必须实际遍历列表,因此请添加一个
currentNode = currentNode.next;
在外while
的尽头.