概念和用途
数组存在长度局限
数组的效率不如链表快,js中是用对象来实现的数组
链表可以用在任何一维数组的位置
关键定义
链表是一系列节点组成的集合,每个节点都是用一个对象的引用指向它的后继,指向另一个节点的引用叫做链。(也就是箭头线的那个连接关系)
单向链表和双向链表
// 单向链表// 1. 抽象一个node节点function Node(ele) {this.element = ele;this.next = null;}// 2. 抽象单向链操作类function LList() {// 2.1 头节点this.head = new Node('head');// 2.2 find方法,查找某个节点this.find = find;// 2.3 insert 插入this.insert = insert// 2.3 display 遍历链表this.display = display// 2.4 寻找上一个this.findPrevious = findPrevious// 2.5 移除(依赖于寻找上一个)this.remove = remove// 2.6 check一个节点是否存在,存在才可以继续findthis.check = check}function check(ele) {var currNode = this.head;while (currNode != null && currNode.element != ele) {currNode = currNode.next;}if (currNode == null) return false;return true}function find(ele) {var currNode = this.head;while (currNode.element != ele) {// 课程里面没有这个,导致find一个不存在的节点时候,死循环了,通过判断返回最后一个节点即可if (currNode.next == null) {return currNode;}currNode = currNode.next;}return currNode;}function insert(ele, target) {// 1. 现有新节点var newNode = new Node(ele);// 2. 查找要插入的节点if (!this.check(target)) {console.log('无法插入')return}var currNode = this.find(target);// 3. 开始插入(变换指针方向)newNode.next = currNode.next;currNode.next = newNode;}function display() {var currNode = this.head;while (currNode.next != null) {console.log(currNode.next.element);// 第一次实现没写地下这个,导致死循环了currNode = currNode.next}console.log('--------diplay done------')}function findPrevious(ele) {var currNode = this.head;if (currNode.element == ele) {return currNode}// 第一次实现写成了 currNode!= null && currNode.element!= ele 大概是脑子进屎了吧while(currNode.next!= null && currNode.next.element!= ele) {currNode = currNode.next}return currNode}function remove(ele) {if(!this.check(ele)){console.log('不存在节点,不必删除')return}var currNode = this.find(ele)var prevNode = this.findPrevious(ele)prevNode.next = currNode.nextcurrNode.next = null}var pList = new LList();pList.insert('p2', 'head');pList.insert('p3', 'p2');pList.insert('p4', 'p3')// pList.display();console.log('-----表演移除和寻找上一个------')console.log(pList.findPrevious('p99'))pList.remove('p33')pList.remove('p3')pList.display();
// 双向链表 理解透双向链表的图示然后根据理解编写即可// 1. 抽象一个node节点function Node(ele) {this.element = ele;this.next = null;// 比单向链表多了前驱节点this.previous = null;}// 2. 抽象双向链操作类function LList() {// 2.1 头节点this.head = new Node('head');// 2.2 find方法,查找某个节点this.find = find;// 2.3 insert 插入this.insert = insert// 2.3 display 遍历链表this.display = display// // 2.4 寻找上一个 双向链表可以直接访问// this.findPrevious = findPrevious// 2.4 反向遍历this.displayReverse = displayReverse// 2.4.1 直接到尾节点this.findLast = findLast// 2.5 移除(依赖于寻找上一个)this.remove = remove// 2.6 check一个节点是否存在,存在才可以继续findthis.check = check}function check(ele) {var currNode = this.head;while (currNode != null && currNode.element != ele) {currNode = currNode.next;}if (currNode == null) return false;return true}function find(ele) {var currNode = this.head;while (currNode.element != ele) {// 课程里面没有这个,导致find一个不存在的节点时候,死循环了,通过判断返回最后一个节点即可if (currNode.next == null) {return currNode;}currNode = currNode.next;}return currNode;}function insert(ele, target) {// 1. 现有新节点var newNode = new Node(ele);// 2. 查找要插入的节点if (!this.check(target)) {console.log('无法插入')return}var currNode = this.find(target);newNode.next = currNode.next;newNode.previous = currNodecurrNode.next = newNode// 判断是否是尾节点if (newNode.next != null) {newNode.next.previous = newNode}}function display() {var currNode = this.head;while (currNode.next != null) {console.log(currNode.next.element);// 第一次实现没写地下这个,导致死循环了currNode = currNode.next}console.log('--------diplay done------')}function findPrevious(ele) {var currNode = this.head;if (currNode.element == ele) {return currNode}// 第一次实现写成了 currNode!= null && currNode.element!= ele 大概是脑子进屎了吧while(currNode.next!= null && currNode.next.element!= ele) {currNode = currNode.next}return currNode}function remove(ele) {if(!this.check(ele)){console.log('不存在节点,不必删除')return}var currNode = this.find(ele)var prevNode = currNode.previousprevNode.next = currNode.nextcurrNode.next.previous = prevNodecurrNode.next = null}function displayReverse() {var currNode = this.findLast()while(currNode.previous != null) {console.log(currNode.element)currNode = currNode.previous}}function findLast() {var currNode = this.headwhile(currNode.next != null) {currNode = currNode.next}return currNode}var pList = new LList();pList.insert('p2', 'head');pList.insert('p3', 'p2');pList.insert('p4', 'p3')// pList.display();console.log('-----表演移除和寻找最后一个------')// console.log(pList.findLast())// pList.displayReverse()// console.log(pList.findPrevious('p99'))pList.remove('p33')pList.remove('p3')pList.displayReverse();
