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)
|
|