Files
freeCodeCamp/curriculum/challenges/ukrainian/10-coding-interview-prep/data-structures/remove-elements-from-a-linked-list-by-index.md

7.2 KiB
Raw Permalink Blame History

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

--description--

Перед тим, як перейти до іншої структури даних, попрактикуймося ще зі зв'язаними списками.

Напишімо метод removeAt, який видаляє element із заданим index. Метод повинен мати назву removeAt(index). Щоб видалити element з певним index, нам знадобиться поновлюваний перелік кожного вузла у зв'язаному списку.

Зазвичай, щоб пройтися елементами зв'язаного списку, користуються технікою, що містить 'runner', або вартового, який "вказує" на вузли, які порівнює ваш код. Оскільки в нашому випадку ми почнемо з head (голови) списку, то змінна currentIndex починається з 0. currentIndex має збільшуватись на одиницю для кожного пройденого вузла.

Як і з методом remove(element), який ми вивчили на минулому уроці, потрібно бути обережним, щоб не осиротити решту елементів нашого списку при видаленні вузла за допомогою методу removeAt(index). Ми зберігаємо ланцюг вузлів, переконавшись, що вузол, в якому міститься посилання на видалений вузол, має ще й посилання на наступний.

--instructions--

Напишіть метод removeAt(index), який видаляє і повертає вузол із заданим index. Цей метод повинен повернути null, якщо заданий index від'ємний, рівний довжині length зв'язаного списку або ж більший за неї.

Примітка: не забувайте підраховувати currentIndex.

--hints--

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

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

Ваш метод removeAt має зменшити length зв'язаного списку на одиницю.

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

Ваш метод removeAt має видалити зі зв'язаного списку елемент із вказаним індексом.

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}}}'
    );
  })()
);

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

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

Ваш метод removeAt має повернути елемент видаленого вузла.

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

Ваш метод removeAt має повернути null, і зв'язаний список не має змінитися, якщо значення вказаного індексу менше за 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}}}'
    );
  })()
);

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

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