Есть две части ответа ...
- исходный первый ответ,
- и второй обновленный ответ, который касается связанного списка OP.
1-й ответ
Произошла ошибка приращения this.length-
вместо this.length--;
.
А как насчет использования подхода Queue
, который инкапсулирует структуру списка, например Array
? ..
class Node {
constructor(value) {
this.value = value;
this.prev = null;
}
}
class Queue {
constructor() {
const queue = [];
this.front = null;
this.rear = null;
this.length = queue.length;
Object.defineProperty(this, 'enqueue', {
value: function (value) {
const node = new Node(value);
const itemCount = queue.push(node);
node.prev = queue[itemCount - 2] || null;
this.front = queue[0];
this.rear = queue[itemCount - 1];
this.length = itemCount;
return node;
}
});
Object.defineProperty(this, 'dequeue', {
value: function () {
const node = queue.shift() || null;
const itemCount = queue.length;
this.front = queue[0] || null;
this.rear = queue[itemCount - 1] || null;
this.length = itemCount;
return node;
}
});
}
}
const queue = new Queue();
console.log('queue.enqueue(5) : ', queue.enqueue(5));
console.log('queue.enqueue(6) : ', queue.enqueue(6));
console.log('queue.enqueue(7) : ', queue.enqueue(7));
console.log('queue.dequeue() : ', queue.dequeue());
console.log('queue.dequeue() : ', queue.dequeue());
console.log(queue);
.as-console-wrapper { max-height: 100%!important; top: 0; }
2-я итерация с подходом связанного списка
Правильный процесс удаления из очереди зависит, скорее, от правильно обслуживаемых ссылок next
. Ссылка prev
- это просто хорошо иметь функцию сверху ... доказательство концепции ...
class Node {
constructor(value) {
this.value = value;
this.prev = null;
this.next = null;
}
}
class Queue {
constructor() {
this.front = null;
this.rear = null;
this.length = 0;
}
enqueue(value) {
const enqueuedNode = new Node(value);
if (this.rear !== null) {
this.rear.next = enqueuedNode;
}
enqueuedNode.prev = this.rear;
const itemCount = ++this.length;
if (itemCount === 1) {
this.front = enqueuedNode;
}
this.rear = enqueuedNode;
return enqueuedNode;
}
dequeue() {
const dequeuedNode = this.front;
if (dequeuedNode !== null) {
dequeuedNode.prev = null;
// dequeuedNode.next = null;
}
this.front = dequeuedNode && dequeuedNode.next;
const itemCount = --this.length;
if (itemCount === 0) {
this.rear = null;
} else if (itemCount <= -1) {
this.length = 0;
}
return dequeuedNode;
}
}
const queue = new Queue();
console.log('queue.enqueue(5) : ', queue.enqueue(5));
console.log('queue : ', queue);
console.log('queue.enqueue(6) : ', queue.enqueue(6));
console.log('queue : ', queue);
console.log('queue.enqueue(7) : ', queue.enqueue(7));
console.log('queue : ', queue);
console.log('queue.dequeue() : ', queue.dequeue());
console.log('queue : ', queue);
console.log('queue.dequeue() : ', queue.dequeue());
console.log('queue : ', queue);
.as-console-wrapper { max-height: 100%!important; top: 0; }