Files
2022-01-14 09:43:16 -08:00

3.8 KiB

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
587d8251367417b2b2512c62 Criar uma classe de lista encadeada 1 301628 create-a-linked-list-class

--description--

Vamos criar uma classe linked list. Cada lista encadeada deve começar com algumas propriedades básicas: uma head (o primeiro item da lista) e um length (o número de itens na lista). Às vezes, você verá implementações de listas encadeadas que incorporam uma tail para o último elemento da lista, mas, por enquanto, vamos nos manter com estes dois. Sempre que adicionarmos um elemento à lista encadeada, a propriedade length deve ser incrementada em mais uma.

Queremos ter uma maneira de adicionar itens à nossa lista encadeada, então o primeiro método que devemos criar é o método add.

Se a lista estiver vazia, adicionar um elemento nela é bastante direto: apenas encapsulamos esse elemento em uma classe Node e atribuímos esse nó à head de nossa lista encadeada.

Mas e se a lista já tiver um ou mais membros? Como adicionamos um elemento à lista? Lembre-se de que cada nó de uma lista encadeada tem uma propriedade next. Para adicionar um nó à lista, encontre o último nó na lista e aponte esse último nó para a propriedade next do novo nó. (Dica: você sabe que chegou ao final de uma lista vinculada quando a propriedade next de um nó é null.)

--instructions--

Escreva um método add que atribui head ao primeiro nó que você insere na lista encadeada. Depois disso, sempre que adicionar um nó, cada nó deve ser referenciado pela propriedade next do nó anterior.

Observação

A propriedade length da lista encadeada deve aumentar de um em um sempre que um elemento for adicionado a ela.

--hints--

A classe LinkedList deve ter o método add.

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

A classe LinkedList deve atribuir head ao primeiro nó adicionado.

assert(
  (function () {
    var test = new LinkedList();
    test.add('cat');
    return test.head().element === 'cat';
  })()
);

O node anterior na sua classe LinkedList deve ter referência ao nó criado mais recentemente.

assert(
  (function () {
    var test = new LinkedList();
    test.add('cat');
    test.add('dog');
    test.add('fish');
    return test.head().next.element === 'dog' && test.head().next.next.element === 'fish';
  })()
);

O size da sua classe LinkedList deve ser igual à quantidade de nós da lista encadeada.

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

--seed--

--seed-contents--

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

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

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

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

  this.add = function(element){
    // 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.head = function(){
    return head;
  };

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

  this.add = function(element){
    // Only change code below this line
    if (head == null) {
      head = new Node(element);
    } 
    else {
      let currentNode = head;
      while (currentNode.next != null) {
        // currentNode.next will be last node of linked list after loop
        currentNode = currentNode.next;
      }
      currentNode.next = new Node(element);
    }
    length++;
    // Only change code above this line
  };
}