'use strict'; class Dequeue { constructor() { this.first = null; this.last = null; } push(item) { const last = this.last; const element = { prev: last, next: null, item }; if (last) last.next = element; else this.first = element; this.last = element; } pop() { const element = this.last; if (!element) return null; if (this.first === element) { this.first = null; this.last = null; } else { this.last = element.prev; this.last.next = null; } return element.item; } unshift(item) { const first = this.first; const element = { prev: null, next: first, item }; if (first) first.prev = element; else this.last = element; this.first = element; } shift() { const element = this.first; if (!element) return null; if (this.last === element) { this.first = null; this.last = null; } else { this.first = element.next; this.first.prev = null; } return element.item; } } // Usage const obj1 = { name: 'first' }; const obj2 = { name: 'second' }; const obj3 = { name: 'third' }; const list = new Dequeue(); list.push(obj1); list.push(obj2); list.unshift(obj3); console.dir(list.pop()); console.dir(list.shift()); console.dir(list.shift());