javascript 链表LinkedList

链表是一种非常常用的数据结构,相比数组,链表至少有以下优点:

  1. 数组长度固定,每次动态申请后需要移动所有元素,链表随着元素增删长度动态变化;
  2. 向数组中间插入/删除元素需要移动该位置后面的所有元素,链表中间插入/删除元素则无需移动。注意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;
   }
}

此外还有双向链表和循环链表等变形的链表。

你可能感兴趣的:(javascript 链表LinkedList)