freeCodeCamp/curriculum/challenges/portuguese/10-coding-interview-prep/data-structures/remove-elements-from-a-link...

5.9 KiB

id title challengeType forumTopicId dashedName
587d8251367417b2b2512c65 Remover elementos de uma lista encadeada por índice 1 301711 remove-elements-from-a-linked-list-by-index

--description--

Antes de avançarmos para outra estrutura de dados, vamos aprender algumas práticas finais com listas encadeadas.

Vamos escrever um método removeAt, que remove o element em um determinado index. O método deve ser chamado removeAt(index). Para remover um element em um certo index, precisaremos manter uma contagem em execução de cada nó enquanto percorremos a lista encadeada.

Uma técnica comum usada para iterar através dos elementos de uma lista encadeada envolve um 'percorredor', ou sentinela, que 'aponte' para os nós que o seu código está comparando. Em nosso caso, começando com a head de nossa lista, iniciamos com uma variável currentIndex com o valor 0. O currentIndex deve incrementar de um em um para cada nó que percorrermos.

Assim como nosso método remove(element), que abordamos em uma aula anterior, precisamos ser cuidadosos para não deixar órfã o resto de nossa lista quando removermos o nó em nosso método removeAt(index). Manteremos nossos nós um após o outro, garantindo que o nó que possui a referência ao nó removido tenha uma referência ao próximo nó.

--instructions--

Escreva um método removeAt(index), que remove e retorna um nó em um determinado index. O método deve retornar null se o dado index for negativo, maior que ou igual ao length da lista encadeada.

Observação: lembre-se de manter a contagem do currentIndex.

--hints--

A classe LinkedList deve ter o método removeAt.

assert(
  (function () {
    var test = new LinkedList();
    return typeof test.removeAt === 'function';
  })()
);

O método removeAt deve diminuir o length da lista encadeada em um.

assert(
  (function () {
    var test = new LinkedList();
    test.add('cat');
    test.add('dog');
    test.add('kitten');
    test.removeAt(1);
    return test.size() === 2;
  })()
);

O método removeAt deve remover o elemento no índice especificado da lista encadeada.

assert(
  (function () {
    var test = new LinkedList();
    test.add('cat');
    test.add('dog');
    test.add('kitten');
    test.add('bird');
    test.removeAt(1);
    return (
      JSON.stringify(test.head()) ===
      '{"element":"cat","next":{"element":"kitten","next":{"element":"bird","next":null}}}'
    );
  })()
);

Quando apenas um elemento está presente na lista encadeada, o método removeAt deve remover e retornar o elemento no índice especificado e reduzir o tamanho da lista encadeada.

assert(
  (function () {
    var test = new LinkedList();
    test.add('cat');
    var removedItem = test.removeAt(0);
    return test.head() === null && test.size() === 0 && removedItem === 'cat';
  })()
);

O método removeAt deve retornar o elemento do nó removido.

assert(
  (function () {
    var test = new LinkedList();
    test.add('cat');
    test.add('dog');
    test.add('kitten');
    return test.removeAt(1) === 'dog';
  })()
);

O método removeAt deve retornar null e a lista encadeada não deve mudar se o índice dado for menor que 0.

assert(
  (function () {
    var test = new LinkedList();
    test.add('cat');
    test.add('dog');
    test.add('kitten');
    var removedItem = test.removeAt(-1);
    return (
      removedItem === null &&
      JSON.stringify(test.head()) ===
        '{"element":"cat","next":{"element":"dog","next":{"element":"kitten","next":null}}}'
    );
  })()
);

O método removeAt deve retornar null e a lista encadeada não deve mudar se o índice dado for maior que ou igual ao length da lista.

assert(
  (function () {
    var test = new LinkedList();
    test.add('cat');
    test.add('dog');
    test.add('kitten');
    var removedItem = test.removeAt(3);
    return (
      removedItem === null &&
      JSON.stringify(test.head()) ===
        '{"element":"cat","next":{"element":"dog","next":{"element":"kitten","next":null}}}'
    );
  })()
);

--seed--

--seed-contents--

function LinkedList() {
  var length = 0;
  var head = null;

  var Node = function(element){
    this.element = element;
    this.next = null;
  };

  this.size = function(){
    return length;
  };

  this.head = function(){
    return head;
  };

  this.add = function(element){
    var node = new Node(element);
    if(head === null){
      head = node;
    } else {
      var currentNode = head;

      while(currentNode.next){
        currentNode  = currentNode.next;
      }

      currentNode.next = node;
    }

    length++;
  };

  // Only change code below this line

  // Only change code above this line
}

--solutions--

function LinkedList() {
  var length = 0;
  var head = null;

  var Node = function (element) {
    this.element = element;
    this.next = null;
  };

  this.size = function () {
    return length;
  };

  this.head = function () {
    return head;
  };

  this.add = function (element) {
    var node = new Node(element);
    if (head === null) {
      head = node;
    } else {
      var currentNode = head;

      while (currentNode.next) {
        currentNode = currentNode.next;
      }

      currentNode.next = node;
    }

    length++;
  };

  this.removeAt = function (index) {
    var currentNode = head;
    var previous = head;
    var count = 0;
    if (index >= length || index < 0) {
      return null;
    }
    if (index === 0) {
      var removed = head.element;
      head = currentNode.next;
    } else {
      while (count < index) {
        previous = currentNode;
        currentNode = currentNode.next;
        count++;
      }
      var removed = previous.next.element;
      previous.next = currentNode.next;
    }
    length--;
    return removed;
  };
}