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