Я делаю проблему CodeFights, пытаясь удалить элементы из одного связанного списка, который имеет значение k.
Ниже приведено то, что у меня есть (l - это список, а k - значение):
function removeKFromList(l, k) {
//figure out the head of the new list so we can reference it later
var head = l;
while (head.value === k){
head = head.next;
}
var node = head;
var temp = null;
while (node && node !== null) {
if (node.next.value === k){
temp = node.next.next;
node.next.next = null;
node.next = temp;
}
node = node.next;
console.log("+++", head)
}
console.log("---", head)
}
Испытательный тест CodeFight составляет 3 → 1 → 2 → 3 → 4 → 5. Окончательный результат был бы равен 1 → 2 → 4 → 5. Но мой консольный журнал "---" продолжает возвращаться "Пусто" (в соответствии с консолью CodeFights).
Мой журнал "+++" возвращает правильную головку с элементом в каждом цикле.
Я вытягивал свои волосы из-за этого, любую идею, что здесь отсутствует?
Попробуй это:
function myRemove(l, k){
if(l == null){
return l;
}
while(l.value == k){
l = l.next;
}
thisNode = l;
nextNode = thisNode.next;
while(nextNode != null){
if(nextNode.value == k){
thisNode.next = nextNode.next;
// No more nodes, ie last node was to be removed
if(thisNode.next == null)
break;
}
thisNode = thisNode.next;
nextNode = thisNode.next;
}
return l;
}
Это можно сделать и путем рекурсии:
function removeKFromList({value, next}, k) {
if(value === k){
return next ? removeKFromList(next, k) : null;
} else {
return {
next : removeKFromList(next),
value
};
}
}
Вам нужно вернуть список, если вы удалите первый узел.
Затем вам понадобится цикл для принятия следующего значения, пока значение не будет найдено.
Наконец, вам нужно проверить, существует ли последний узел и если значение найдено, а затем назначить следующий узел последнему следующему свойству.
function removeNode(list, value) {
var node = list,
last;
if (node && node.value === value) {
return node.next;
}
while (node && node.value !== value) {
last = node,
node = node.next;
}
if (last && node.value === value) {
last.next = node.next;
}
return list;
}
var list = { value: 1, next: { value: 2, next: { value: 3, next: { value: 4, next: { value: 5, next: { value: 6, next: { value: 7, next: null } } } } } } };
list = removeNode(list, 5);
console.log(list)
list = removeNode(list, 1);
console.log(list)
list = removeNode(list, 7);
console.log(list)
.as-console-wrapper { max-height: 100% !important; top: 0; }