17.10.2013, 10:09
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: node js связанный список
Еще один метод toArray, а так же теперь нельзя удалить элемент из чужого списка (каждый элемент хранит ссылку на список)
function LinkedList() { this.first = null; this.last = null; this.length = 0; } if (module !== undefined) { module.exports = LinkedList; } LinkedList.prototype.addToStart = function (value) { var first = this.first; var newItem = { before: null, after: first, value: value, list: this }; if (first) { first.before = newItem; } if (this.last == null) { this.last = newItem; } this.first = newItem; this.length++; return newItem; }; LinkedList.prototype.add = LinkedList.prototype.addToEnd = function (value) { var last = this.last; var newItem = { before: last, after: null, value: value, list: this }; if (last) { last.after = newItem; } if (this.first == null) { this.first = newItem; } this.last = newItem; this.length++; return newItem; }; LinkedList.prototype.insertBefore = function (value, listItem) { if (!listItem) { throw new Error('listItem == null'); } var newItem = { before: listItem.before, after: listItem, value: value, list: this }; if (newItem.before == null) { this.first = newItem; } else { newItem.before.after = newItem; } listItem.before = newItem; this.length++; return newItem; }; LinkedList.prototype.insertAfter = function (value, listItem) { if (!listItem) { throw new Error('listItem == null'); } var newItem = { before: listItem, after: listItem.after, value: value, list: this }; if (newItem.after == null) { this.last = newItem; } else { newItem.after.before = newItem; } listItem.after = newItem; this.length++; return newItem; }; LinkedList.prototype.remove = function (listItem) { if (!listItem) { throw new Error('listItem == null'); } if (listItem.list !== this) { throw new Error('listItem from another list!'); } if (listItem.before) { listItem.before.after = listItem.after; } else { this.first = listItem.after; } if (listItem.after) { listItem.after.before = listItem.before; } else { this.last = listItem.before; } listItem.list = null; listItem.before = null; listItem.after = null; this.length--; }; LinkedList.prototype.clear = function () { this.foreach(function(element, next){ element.before = null; element.after = null; element.list = null; next(); }); this.first = null; this.last = null; this.length = 0; }; LinkedList.prototype.toArray = function () { var array = new Array(this.length); var element = this.first; var index = 0; while (element) { array[index++] = element.value; element = element.after; } return array; }; LinkedList.prototype.foreach = function (processItemCallback, onEndCallback) { function nextItemProcessor(item) { return function () { if (item) { processItemCallback(item, nextItemProcessor(item.after)); } else { if (onEndCallback) onEndCallback(); } }; } nextItemProcessor(this.first)(); };
|
(Offline)
|
|