57 lines
1.1 KiB
JavaScript
57 lines
1.1 KiB
JavaScript
/*
|
|
* Simple doubly linked list implementation derived from Cormen, et al.,
|
|
* "Introduction to Algorithms".
|
|
*/
|
|
|
|
function List () {
|
|
const sentinel = {}
|
|
sentinel._next = sentinel._prev = sentinel
|
|
this._sentinel = sentinel
|
|
}
|
|
|
|
List.prototype.dequeue = function () {
|
|
const sentinel = this._sentinel
|
|
const entry = sentinel._prev
|
|
if (entry !== sentinel) {
|
|
unlink(entry)
|
|
return entry
|
|
}
|
|
}
|
|
|
|
List.prototype.enqueue = function (entry) {
|
|
const sentinel = this._sentinel
|
|
if (entry._prev && entry._next) {
|
|
unlink(entry)
|
|
}
|
|
entry._next = sentinel._next
|
|
sentinel._next._prev = entry
|
|
sentinel._next = entry
|
|
entry._prev = sentinel
|
|
}
|
|
|
|
List.prototype.toString = function () {
|
|
const strs = []
|
|
const sentinel = this._sentinel
|
|
let curr = sentinel._prev
|
|
while (curr !== sentinel) {
|
|
strs.push(JSON.stringify(curr, filterOutLinks))
|
|
curr = curr._prev
|
|
}
|
|
return '[' + strs.join(', ') + ']'
|
|
}
|
|
|
|
function unlink (entry) {
|
|
entry._prev._next = entry._next
|
|
entry._next._prev = entry._prev
|
|
delete entry._next
|
|
delete entry._prev
|
|
}
|
|
|
|
function filterOutLinks (k, v) {
|
|
if (k !== '_next' && k !== '_prev') {
|
|
return v
|
|
}
|
|
}
|
|
|
|
export default List
|