先po一张单向链表的图。单向链表就是最基础的链表啦~
下面是如何用js实现一个链表。
定义一个链表的节点对象Node:
class Node{
constructor(ele){
this.element = ele
this.next = null
}
}
定义一个链表对象LinkList,该对象包含的属性:head(头指针)、length(链表长度),方法有append(增加节点)、deleteNode(删除某一位置的节点)、insertNode(在某个位置插入节点)。
class LinkList {
length = 0; //链表的长度
head = null //头指针
append(ele){ //增加节点
let node = new Node(ele)
let current
if(this.head == null){
this.head = node
}else{
current = this.head
while(current.next){
current = current.next
}
current.next = node
}
this.length ++
}
deleteNode(pos){ //删除某个下标处的节点
let current = this.head
if(this.head == null){
console.log("链表为空,无法删除")
return ;
}else if(pos+1 > this.length){
console.log("下标大于链表长度,无法删除")
}else{
let pre
let i = 0
current = this.head
//若pos为0,即删除第一个位置的元素,需要让head指向第二个节点,不为零则往下查找
if(pos){
while(i < pos){
pre = current
current = current.next
i++
}
pre.next = current.next
}else{
this.head = current.next
}
this.length --
}
}
insertNode(pos,ele){ //在某个位置插入节点
let newNode = new Node(ele)
let current = this.head
let pre
if(pos>this.length){
console.log("下标大于链表长度,无法添加")
}
else{
let i = 0
//若pos为0,即在第一个位置插入,需要让head指向新节点,不为零则往下查找
if(pos){
while(i<pos){
pre = current
current = current.next
i++
}
pre.next = newNode
newNode.next = current
}else{
newNode.next = this.head
this.head = newNode
}
this.length ++
}
}
}
链表插入节点原理:先让当前节点的前一个结点指向新节点,再让新节点的next指向当前节点。
链表删除节点原理:让当前节点的前一个节点的next指向当前节点的next,当前节点置为空或做一些其他处理(根据你的需求来定啦)
这些代码测试过了应该是没问题的。本人现在还是一个前端小菜鸡,若有不对的地方请多多指正😀