Я хотел бы реализовать структуру данных LinkedList в JS

1
var MyLinkedList = function(val) {
    this.head = {
    val: val,
    next: null
    };
this.length = 1;
};

MyLinkedList.prototype.addAtHead = function(value) {
    var newNode = {
        val: value}
        newNode.next = this.head
    this.length++
    return newNode;
};
var test = new MyLinkedList(3);
var test2 = test.addAtHead(12);
var test3 = test2.addAtHead(4)

Первые два теста работают для меня, но когда я пытаюсь добавить еще один узел в голову в test3, возникает ошибка: "TypeError: test2.addAtHead не является функцией". Я не знаю, в чем проблема.

  • 2
    Почему вы ожидаете, что test2 (который является возвращенным объектом newNode ) будет иметь этот метод?
  • 0
    о мой благодарю вас.
Теги:

2 ответа

0

В addAtHead() вы не создаете экземпляр своего MyLinkedList, вы просто создаете объект со схожими свойствами. Вам нужно создать экземпляр, чтобы он имел метод.

Я думаю, что ваш общий подход может быть немного выключен. Вам нужно, чтобы каждая ссылка в вашем списке была экземпляром MyLinkedList. Похоже, вы можете создавать нечто более похожее на массив.

Существует два подхода к созданию связанного списка. Во-первых, каждая ссылка в списке одна и та же, и вы просто отслеживаете голова и ток напрямую:

function LinkedList(value) {
  return { value, next: null };
}

const head = new LinkedList(5);
head.next = LinkedList(8);
head.next.next = LinkedList(3);

let current = head;
while (current) {
  console.log(current.value);
  current = current.next;
}

Если вы затем захотите обернуть это во что-то, что управляет материалом для отслеживания, вам понадобится второй класс:

function LinkedListNode(value) {
  return { value, next: null };
}

function LinkedList(firstValue) {
  this.head = new LinkedListNode(firstValue);
  this.current = this.head;
  this.tail = this.current;
  this.length = 1;
}

LinkedList.prototype.add = function(val) { 
  this.tail.next = new LinkedListNode(val); 
  this.tail = this.tail.next;
  this.length++;
};

LinkedList.prototype.rewind = function() { this.current = this.head; }
LinkedList.prototype.next = function() { this.current = this.current.next; }

const linkedList = new LinkedList(5);
linkedList.add(3);
linkedList.add(5);
linkedList.add(8);

while(linkedList.current) {
  console.log(linkedList.current.value);
  linkedList.next();
}

Если вы хотите добавить что-то в голову, это будет действительно вставка, где вам нужно поставить предыдущий head.next в качестве next элемента:

function LinkedListNode(value) {
  return { value, next: null };
}

function LinkedList(firstValue) {
  this.head = new LinkedListNode(firstValue);
  this.current = this.head;
  this.tail = this.current;
  this.length = 1;
}

LinkedList.prototype.add = function(val) { 
  this.tail.next = new LinkedListNode(val); 
  this.tail = this.tail.next;
  this.length++;
};

LinkedList.prototype.rewind = function() { this.current = this.head; }
LinkedList.prototype.next = function() { this.current = this.current.next; }

LinkedList.prototype.insertAtHead = function(val) {
  const newNode = new LinkedListNode(val);
  newNode.next = this.head.next;
  this.head.next = newNode;
}

const linkedList = new LinkedList(1);
linkedList.insertAtHead(2);
linkedList.insertAtHead(3);
linkedList.insertAtHead(4);

while(linkedList.current) {
  console.log(linkedList.current.value);
  linkedList.next();
}

Обратите внимание, что, за исключением первого значения, с этой функцией все значения addAtHead назад (вот почему немного странно иметь функцию с именем addAtHead).

  • 0
    Спасибо за ваш ответ! это было упражнение leetcode, они назвали функцию.
0

Здесь вы можете сделать это, вернув this и указав head на newNode

var MyLinkedList = function(val) {
  this.head = {
    val: val,
    next: null
  };
  this.length = 1;
};

MyLinkedList.prototype.addAtHead = function(value) {
  var newNode = {
    val: value,
  }
  newNode.next = this.head;
  this.head = newNode;
  this.length++;
  return this;
};
var test = new MyLinkedList(3);
console.log(test);
var test2 = test.addAtHead(12);
console.log(test2);
var test3 = test2.addAtHead(4);
console.log(test3);
  • 0
    @ FanniRákosi, так как вы добавили addAtHead в MyLinkedList , вы должны вернуть его, чтобы в новой переменной была доступна эта функция, вы можете попробовать нажать на Run code snippet чтобы проверить вывод, и если это решит вашу проблему, вы можете принять ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню