| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- /*
- * 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
|