链表
类似于火车节 有指针链接两个数据,每个数据"块"都有一个指和指向下一个数据的next
指针
创建链表
//首先需要一个存放数据的node,里面包含当前数据的指和指向下一个数据的指针
class Node{
constructor(element){
this.element = value
this.next = undefined
}
}
//创建链表
class LinkList{
consturctor(){
this.count = 0
this.head = undefined
}
}
常见的方法
push(element)
:向链表尾部添加元素
push(element){
const node = new Node(element)
let current
if(this.head === null){
this.head = node //如果是一个空链表,那么直接将head指向node
}else{
current = this.head
while(current.next !=null){
current = current.next
}
current.next = node
}
this.count++
}
insert(element,position)
:向链表特定位置插入一个新元素getElementAt(index)
:返回链表中特定位置的元素,如果不存在就是undefinedremove(element)
:从链表中移除一个元素indexOf(element)
:返回需要的元素的索引,如果没有找到,会返回-1removeAt(element)
:从链表中特定位置移除一个元素isEmpty()
:如果链表中不包含任何元素,直接返回truesize()
:返回链表的元素个数toString
:将链表以字符串返回
基本思路
- 无论添加还是删除,首先都要检查链表是不是空的,如果是的话 就直接进行操作
- 如果不是空的,会分为三种情况:
(1).开头删除和添加:添加:直接把head指针给node即可;删除:让head指针指向node.next
(2).中间删除和添加:此时都需要借助第二个指针作为辅助添加或删除
(3).尾部删除和添加:添加:直接找到最后一个元素,并将其node.next指向新的元素即可;删除:需要找到最后一个元素(因为最后一个元素指向的必是null),然后再找到他的上一个元素,将上一个元素的指针直接指向null
双向链表
一个元素中,除了有值和指向下一个值的指针外,还有一个往前的指针,指向上一个元素
class doublylNode extends Node{
constructor(element,next,prev){
super(element,next)
this.prev = prev //新增的往前的指针
}
}
添加元素
- 在开头添加:如果已经有元素的情况下,引入一个新的指针,指向旧的元素,令旧元素的prev指向新元素,令新元素next指针指向旧元素,且head指向新元素,新元素prev设置为null
- 在结尾添加:找到最后一个元素,令最后一个元素的next指向新元素node;新元素prev指向旧元素,next指向null
- 在中间任意位置添加:这里需要两个指针,首先找到要添加的位置的前一元素设置为previous,将previous.next指向新元素node,node.prev指向previou,node.next指向下一个元素current
删除元素
与上逻辑类似
循环链表
表示最后一个元素会指向第一个元素head
循环单向链表
直接最后一个元素指向第一个元素
循环双向链表
因为一个元素有两个指针,所以第一个元素head的prev指向最后一个元素,最后一个元素的next指向第一个元素