// 节点定义 class Node{ constructor(element){ this.element = element; this.next = null; } }
链表实现添加节点的方法有: add(element) 和 addAt(index,element) , 其中 add 方法是直接将节点添加到链表的最后, addAt 方法是根据索引来添加节点
链表实现删除节点的方法有: remove(element) 和 removeAt(index) , 其中 remove 方法是根据节点值来删除节点, removeAt 方法是根据索引来删除节点
链表实现查询节点的方法有: indexOf(element) 和 elementAt(index), 其中 indexOf 方法是根据节点值来获得节点的索引, elementAt 是根据节点索引来获得节点
下面是链表的实现:
// 链表 class LinkedList{ constructor(){ this.length=0; this.head=null; } // 返回链表长度 size(){ return this.length; } // 返回链表头节点 head(){ return this.head; } // 往链表最后面加节点 add(element){ let node = new Node(element); // 1 当链表为空时 if(this.head===null){ this.head=node; } // 2 当链表不为空 else { // 下面这句是链表必备代码,获得头节点,从头节点开始遍历 let currentNode = this.head; // 循环到最后一个节点(currentNode.next为null时,currentNode为最后一个节点) while(currentNode.next){ currentNode = currentNode.next; } // currentNode.next 指向新的节点 currentNode.next = node; } // 递增链表长度 this.length++; } // 根据节点来删除节点 remove(element){ const index = this.indexOf(element); return this.removeAt(index); } // 返回 true 或者 false,代表链表是否为空 isEmpty(){ this.length===0; } // 找到指定节点的下标 indexOf(element){ let currentNode = this.head; // 这里 index 从 -1 开始,自己动手试试为什么 let index = -1; // 循环所有节点(currentNode为null时,即所有节点都遍历完了,循环终止) while(currentNode){ index++; if(currentNode.element===element){ return index; } currentNode = currentNode.next; } return -1; } // 返回指定索引的节点 elementAt(index){ let currentNode = this.head; let count=0; while(count<index){ count++; currentNode = currentNode.next; } return currentNode; } // 在指定的位置加入节点 addAt(index,element){ let node = new Node(element); let currentNode = this.head; let previousNode; let currentIndex=0; // 超出链表范围返回 false,注意这里不能加等于 因为最后一个位置可以加元素 if(index>this.length || index<0){ return false; } // 1 如果是在最前面加入节点 if(index===0){ node.next = currentNode; this.head = node; } // 2 如果在中间或最后加入节点 else{ // 循环条件在currentIndex等于index时终止 while(currentIndex<index){ currentIndex++; previousNode=currentNode; currentNode = currentNode.next; } node.next= currentNode; previousNode.next = node; } this.length++; } // 在指定索引下删除节点 // 和上面的 addAt 方法差不多,只是在while循环后的操作不一样,即插入节点和删除节点的所需的操作不一样 removeAt(index){ let currentNode = this.head; let previousNode; let currentIndex=0; // 注意这里要加等于号,因为等于的时候,index下标指向的节点为null if(index>=this.length || index<0){ return false; } // 1 要删除的为头节点 if(index===0){ this.head = currentNode.next; } // 2 要删除的不是头节点 else{ while(currentIndex<index){ currentIndex++; previousNode=currentNode; currentNode=currentNode.next; } previousNode.next = currentNode.next; } this.length--; return currentNode.element; } }