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 не является функцией". Я не знаю, в чем проблема.
В 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
).
Здесь вы можете сделать это, вернув 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);
addAtHead
в MyLinkedList
, вы должны вернуть его, чтобы в новой переменной была доступна эта функция, вы можете попробовать нажать на Run code snippet
чтобы проверить вывод, и если это решит вашу проблему, вы можете принять ответ.
test2
(который является возвращенным объектомnewNode
) будет иметь этот метод?