javascript 链表LinkedList
2018-08-03 本文已影响0人
ak1947
链表是一种非常常用的数据结构,相比数组,链表至少有以下优点:
- 数组长度固定,每次动态申请后需要移动所有元素,链表随着元素增删长度动态变化;
- 向数组中间插入/删除元素需要移动该位置后面的所有元素,链表中间插入/删除元素则无需移动。注意js中的数组是以类形式实现的,splice方法可以支持中间位置增删元素,但它的效率要比C和Java等语言的数组低。
链表的js实现
链表节点
function Node(element) {
this.element = element;
this.next = null;
}
链表
function LList() {
this.head = new Node("head");
this.find = find;
this.insert = insert;
this.remove = remove;
this.display = display;
}
function find(item) {
var currNode = this.head;
while (currNode != null && currNode.element != elem) {
currNode = currNode.next;
}
return currNode;
}
function insert(newElem, item) {
var newNode = new Node(newElem);
var current = this.find(item);
if (current != null) {
newNode.next = current.next;
current.next = newNode;
}
else {
newNode.next = this.head.next;
this.head.next = newNode;
}
}
function display() {
var currNode = this.head;
while (!(currNode.next == null)) {
print(currNode.next.element);
currNode = currNode.next;
}
}
function findPrevious(item) {
var currNode = this.head;
while (!(currNode.next == null) && (currNode.next.element != item)) {
currNode = currNode.next;
}
if (currNode.next.element == item)
return currNode;
else
return null;
}
function remove(item) {
var prevNode = this.findPrevious(item);
if (prevNode != null && !(prevNode.next == null)) {
prevNode.next = prevNode.next.next;
}
}
此外还有双向链表和循环链表等变形的链表。