编程语言
首页 > 编程语言> > JavaScript:链表

JavaScript:链表

作者:互联网

  链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

  链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

/**
 * 节点
 */
function Node(element) {
  this.element = element; // 当前节点的元素
  this.next = null; // 下一个节点链接
}

/**
 * 单向链表类
 */
function LList() {
  this.head = new Node("head");
}

/**
 * 查找元素
 */
LList.prototype.find = function (item) {
  var currNode = this.head;
  while (currNode.element != item) {
    currNode = currNode.next;
  }
  return currNode;
};

/**
 * 查找前一元素
 */
LList.prototype.findPrevious = function (item) {
  var currNode = this.head;
  while (currNode.next != null && currNode.next.element != item) {
    currNode = currNode.next;
  }
  return currNode;
};

/**
 * 插入节点
 */
LList.prototype.insert = function (newElement, item) {
  var newNode = new Node(newElement);
  var currNode = this.find(item);
  newNode.next = currNode.next;
  currNode.next = newNode;
};

/**
 * 删除节点
 */
LList.prototype.remove = function (item) {
  var preNode = this.findPrevious(item);
  if (preNode.next != null) {
    preNode.next = preNode.next.next;
  }
};

/**
 * 显示链表元素
 */
LList.prototype.display = function () {
  var currNode = this.head;
  while (!!currNode && !!currNode.next) {
    if (!!currNode.next) {
      console.debug(currNode.next.element);
    }

    currNode = currNode.next;
  }
};

/**
 * 判断是否有环
 */
LList.prototype.exitLoop = function () {
  var slow = this.head;
  var fast = this.head;

  while (slow != null && fast != null && fast.next != null) {
    slow = slow.next;
    fast = fast.next.next;
    if (slow == fast) return true;
  }

  return false;
};

var fruits = new LList();

fruits.insert("Apple", "head");
fruits.insert("Banana", "Apple");
fruits.insert("Pear", "Banana");
fruits.insert("Grape", "Pear");

fruits.display();

 

标签:LList,JavaScript,currNode,next,链表,item,var
来源: https://www.cnblogs.com/hanjc/p/14341500.html