链表
Posted BillGates--
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表相关的知识,希望对你有一定的参考价值。
// 节点定义
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;
}
}
以上是关于链表的主要内容,如果未能解决你的问题,请参考以下文章
NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段