js:数据结构笔记5--链表
数组:
- 其他语言的数组缺陷:添加/删除数组麻烦;
- js数组的缺点:被实现为对象,效率低;
- 如果要实现随机访问,数组还是更好的选择;
链表:
- 结构图:
- 基本代码:
function Node (elem) { this.elem = elem; this.next = null; } function LList() { this.head = new Node("head"); this.find = find; this.insert = insert; this.findPrevious = findPrevious; this.remove = remove; this.display = display; } function find(item) { var currNode = this.head; while(currNode.elem !== item) { currNode = currNode.next; } return currNode; } function insert(newElem,item) { var newNode = new Node(newElem); var currNode = this.find(item); newNode.next = currNode.next; currNode.next = newNode; } function display() { var currNode = this.head; while(!(currNode.next === null)) { console.log(currNode.next.elem); currNode = currNode.next; } } function findPrevious(item) { var currNode = this.head; while(!(currNode.next === null) && (currNode.next.elem !== item)) { currNode = currNode.next; } return currNode; } function remove(item) { var prevNode = this.findPrevious(item); if(!(prevNode.next === null)) { prevNode.next = prevNode.next.next; } }
操作:demo;
双向链表:
- 结构图:
- 基本代码:
function Node(elem) { this.elem = elem; this.next = null; this.previous = null; } function LList() { this.head = new Node("head"); this.find = find; this.insert = insert; this.display = display; this.remove = remove; this.findLast = findLast; this.dispReverse = dispReverse; } function find(item) { var currNode = this.head; while(currNode.elem !== item) { currNode = currNode.next; } return currNode; } function insert(newElem,item) { var newNode = new Node(newElem); var currNode = this.find(item); newNode.next = currNode.next; newNode.previous = currNode; currNode.next = newNode; } function display() { var currNode = this.head; while(!(currNode.next === null)) { console.log(currNode.next.elem); currNode = currNode.next; } } function remove(item) { var currNode = this.find(item); if(!(currNode.next === null)) { currNode.previous.next = currNode.next; currNode.next.previous = currNode.previous; currNode.next = null; currNode.previous = null; } } function findLast() { var currNode = this.head; while(!(currNode.next === null)) { currNode = currNode.next; } return currNode; } function dispReverse() { var currNode = this.findLast(); while(!(currNode.previous === null)) { console.log(currNode.elem); currNode = currNode.previous; } }
操作:demo;
循环链表:
- 结构图: