Files

6.4 KiB
Raw Permalink Blame History

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
587d8251367417b2b2512c63 Видалення елементів зі зв'язаного списку 1 301712 remove-elements-from-a-linked-list

--description--

Метод remove це наступний важливий метод, необхідний у будь-якому зв'язаному списку. Цей метод повинен приймати елемент, який ми хочемо видалити, як аргумент, а потім виконувати пошук по списку, щоб знайти та видалити вузол, який містить цей елемент.

Щоразу, коли ми видаляємо вузол зі зв'язаного списку, важливо, щоб ми таким чином не осиротили ненароком решту списку. Нагадуємо, що кожен вузол має властивість next, яка вказує на наступний вузол після даного у списку. Якщо ми видаляємо, скажімо, середній елемент, то нам потрібно переконатися в тому, що є з'єднання між властивістю next попереднього вузла та властивістю next цього середнього елементу (яка вказує на наступний вузол у списку!)

Це може здатися доволі заплутано, тому повернімося до прикладу з лінією конга, щоб у нас була гарна концептуальна модель. Уявіть себе у лінії конга, причому людина, що стояла безпосередньо перед вами, виходить з лінії. Ця людина більше нікого не тримає руками в цій лінії, а ви відповідно більше не тримаєте цю людину, адже вона покинула лінію. Ви робите крок вперед і кладете руки на наступну людину, яку бачите.

Якщо елемент, який ми хочемо видалити, це голова зв'язаного списку, тобто head, ми перепризначаємо head другому вузлу цього списку.

--instructions--

Напишіть метод remove, який видаляє елемент зі зв'язаного списку.

Примітка: довжина length зв'язаного списку повинна зменшуватися на одиницю щоразу, коли елемент вилучено з цього списку.

--hints--

Ваш клас LinkedList має містити метод remove.

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

Метод remove повинен перепризначити head другому вузлу після вилучення першого вузла.

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

Метод remove повинен зменшити довжину length зв'язаного списку на одиницю після видалення кожного вузла.

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

Метод remove повинен перепризначити посилання в попередньому вузлі посиланню next у вилученому вузлі.

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

Метод remove не повинен змінювати наш зв'язаний список, якщо заданого елемента не існує в цьому списку.

assert(
  (function () {
    var test = new LinkedList();
    test.add('cat');
    test.add('dog');
    test.add('kitten');
    test.remove('elephant');
    return (
      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++;
  };

  this.remove = 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.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.remove = function(element){
    if (head === null) {
      return;
    }
    var previous;
    var currentNode = head;

    while (currentNode.next !== null && currentNode.element !== element) {
      previous = currentNode;
      currentNode = currentNode.next;
    }

    if (currentNode.next === null && currentNode.element !== element) {
      return;
    }
    else if (previous) {
      previous.next = currentNode.next;
    } else {
      head = currentNode.next;
    }

    length--;
  };
}