我正在解决一个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;
}
};
我的removeNodes函数如下...
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。
我对为什么一直得到this.tail.value = 5而不是为什么感到困惑 this.tail.value = 3,this.tail.next = null。
这是REPL
答案 0 :(得分:2)
由于必须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
的末尾。