Удалить элементы из односвязного списка (javascript)

1

Я делаю проблему 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).

Мой журнал "+++" возвращает правильную головку с элементом в каждом цикле.

Я вытягивал свои волосы из-за этого, любую идею, что здесь отсутствует?

  • 0
    Пожалуйста, добавьте пример списка хорошо, как вызов функции со значениями.
  • 0
    Я включил в тестовый кейс. Список уже указан как SLL, поэтому мне не нужно его создавать. Надеюсь это поможет
Показать ещё 2 комментария
Теги:
algorithm
linked-list
closures
singly-linked-list

3 ответа

0

Попробуй это:

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;
}
0

Это можно сделать и путем рекурсии:

 function removeKFromList({value, next}, k) {       
   if(value === k){
      return next ? removeKFromList(next, k) : null;
   } else {
      return {
        next : removeKFromList(next),
        value
       };
  }
 }
0

Вам нужно вернуть список, если вы удалите первый узел.

Затем вам понадобится цикл для принятия следующего значения, пока значение не будет найдено.

Наконец, вам нужно проверить, существует ли последний узел и если значение найдено, а затем назначить следующий узел последнему следующему свойству.

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; }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню