Двусвязный список - элемент недоступен - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь написать функцию reverse в классе двусвязных списков. Для этого я хотел сохранить «старый» головной узел в переменной, чтобы получить к нему доступ позже после того, как я переключусь между головой и хвостом. Поэтому позже, когда я пытаюсь получить доступ к узлу prev переменной, которую я сохранил, код выдает ошибку, сообщающую, что значение переменной равно нулю, и prev недоступен. Имейте в виду, что заранее я написал тривиальные функции, такие как pu sh, pop, shift et c. без ошибок.

class Node {
  constructor(val) {
    this.val = val;
    this.next = null;
    this.prev = null;
  }
}

class DoublyLinkedList {
  constructor() {
    this.head = null;
    this.tail = null;
    this.length = 0;
  }
  push(val) {
    var newNode = new Node(val);
    if (this.length === 0) {
      this.head = newNode;
      this.tail = newNode;
    } else {
      this.tail.next = newNode;
      newNode.prev = this.tail;
      this.tail = newNode;
    }
    this.length++;
    return this;
  }

  reverse() {
    var current = this.head;
    this.head = this.tail;
    this.tail = current;
    var prev, next;
    for (let i = 0; 0 < this.length; i++) {
      prev = current.prev;
      next = current.next;
      current.next = prev;
      current.prev = next;
      current = next;
    }
    return this;
  }
}

let doubly = new DoublyLinkedList();
doubly.push("1");
doubly.push("2");
doubly.push("3");
doubly.push("4");
doubly.reverse();

Моя функция reverse еще не проверена, потому что я застрял с упомянутой проблемой. Ошибка (выдается в первой строке l oop):

TypeError: Cannot read property 'prev' of null

1 Ответ

2 голосов
/ 01 мая 2020

В вашем коде есть небольшая опечатка:

for (let i = 0; 0 < this.length; i++) {

должно читаться следующим образом (примечание i вместо 0 в условии):

for (let i = 0; i < this.length; i++) {

Как написано, ваш код перебирает конец списка, устанавливая current = null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...