Files

5.5 KiB
Raw Permalink Blame History

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
587d825a367417b2b2512c87 Створення двобічно зв'язаного списку 1 301626 create-a-doubly-linked-list

--description--

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

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

--instructions--

Ми задали об'єкт Node і почали наш DoublyLinkedList. Додаймо до нашого двобічно зв'язаного списку два методи під назвами add і remove. Метод add повинен додавати вказаний елемент до списку, а метод remove - видаляти всі входження заданого елемента у списку.

Під час написання цих методів будьте уважні з обробкою будь-яких можливих граничних випадків, як-от видалення першого чи останнього елементу. Крім того, спроба видалення будь-якого елементу з порожнього списку має повертатися як null.

--hints--

Повинна існувати структура даних DoublyLinkedList.

assert(
  (function () {
    var test = false;
    if (typeof DoublyLinkedList !== 'undefined') {
      test = new DoublyLinkedList();
    }
    return typeof test == 'object';
  })()
);

У DoublyLinkedList повинен бути метод add.

assert(
  (function () {
    var test = false;
    if (typeof DoublyLinkedList !== 'undefined') {
      test = new DoublyLinkedList();
    }
    if (test.add == undefined) {
      return false;
    }
    return typeof test.add == 'function';
  })()
);

У DoublyLinkedList повинен бути метод remove.

assert(
  (function () {
    var test = false;
    if (typeof DoublyLinkedList !== 'undefined') {
      test = new DoublyLinkedList();
    }
    if (test.remove == undefined) {
      return false;
    }
    return typeof test.remove == 'function';
  })()
);

Спроба видалення елементу з пустого списку має повертатися як null.

assert(
  (function () {
    var test = false;
    if (typeof DoublyLinkedList !== 'undefined') {
      test = new DoublyLinkedList();
    }
    return test.remove(100) == null;
  })()
);

Метод add має додавати елементи до списку.

assert(
  (function () {
    var test = false;
    if (typeof DoublyLinkedList !== 'undefined') {
      test = new DoublyLinkedList();
    }
    test.add(5);
    test.add(6);
    test.add(723);
    return test.print().join('') == '56723';
  })()
);

Кожен вузол повинен відстежувати попередній вузол.

assert(
  (function () {
    var test = false;
    if (typeof DoublyLinkedList !== 'undefined') {
      test = new DoublyLinkedList();
    }
    test.add(50);
    test.add(68);
    test.add(73);
    return test.printReverse().join('') == '736850';
  })()
);

Повинна бути можливість видалити зі списку перший елемент.

assert(
  (function () {
    var test = false;
    if (typeof DoublyLinkedList !== 'undefined') {
      test = new DoublyLinkedList();
    }
    test.add(25);
    test.add(35);
    test.add(60);
    test.remove(25);
    return test.print().join('') == '3560';
  })()
);

Повинна бути можливість видалити зі списку останній елемент.

assert(
  (function () {
    var test = false;
    if (typeof DoublyLinkedList !== 'undefined') {
      test = new DoublyLinkedList();
    }
    test.add(25);
    test.add(35);
    test.add(60);
    test.remove(60);
    return test.print().join('') == '2535';
  })()
);

--seed--

--after-user-code--

DoublyLinkedList.prototype = Object.assign(
  DoublyLinkedList.prototype,
  {

  print() {
    if (this.head == null) {
      return null;
    } else {
      var result = new Array();
      var node = this.head;
      while (node.next != null) {
        result.push(node.data);
        node = node.next;
      };
      result.push(node.data);
      return result;
    };
  },
  printReverse() {
    if (this.tail == null) {
      return null;
    } else {
      var result = new Array();
      var node = this.tail;
      while (node.prev != null) {
        result.push(node.data);
        node = node.prev;
      };
      result.push(node.data);
      return result;
    };
  }
});

--seed-contents--

var Node = function(data, prev) {
  this.data = data;
  this.prev = prev;
  this.next = null;
};
var DoublyLinkedList = function() {
  this.head = null;
  this.tail = null;
  // Only change code below this line

  // Only change code above this line
};

--solutions--

// solution required