链表
本次我将使用js为大家实现链表的一些操作,包括链表添加,链表某一个位置添加元素,移除某一位置元素,查找元素位置,根据元素删除链表元素,以及查看链表头,链表长度等操作
先说下链表的概念,就是 内容 》下一项指针 – 内容 》下一项指针 每一项都会指向下一项 每一个元素保留下一个元素位置,向一个个老鼠咬这尾巴一样。
这里我们同样需要一个辅助类来帮忙实现与下一个的连接,这个辅助类主要为了实现让next指向下一个节点元素。同样需要一个链表头起始为null以及长度起始为0
var linkedList = function () {
// 链表头
var head = null
// 链表长度
var length = 0
// 辅助类 :节点 创建链表元素
var Node = function (element) {
this.element = element
this.next = null
}
}
添加元素
先把新元素通过辅助类给实现带有next指针的node节点,然后应该判断是否头部有元素,如果链表头为空则就让该node节点为链表头,如果头部有元素不为空,则就依次寻找后面直到最后一个node节点的next为null,然后将next指向新node节点,同样让length+1
来用js实现以下,注释也很详细
this.append = function (element) {
var node = new Node(element)
// node{
// element:element
// next:null
// }
// 判断链表头是否有元素,没有就直接把node给head
if (head == null) {
head = node
} else {
// 定义当前的链表元素为链表头
var current = head
// 判断 只要当前的下一项指针不是null 就循环
while (current.next) {
// 让当前的链表元素等于当前的下一项指针(下一项内容)
current = current.next
}
// while循环执行完后,current已经是链表最后一项了
// 将指针指向下一项
current.next = node
}
// 添加后链表长度加一
length++
}
链表某一位置插入元素
接下来就是在某一位置插入元素了,这里的插入元素指在position的位置上将其next指向新node节点,然后新node节点的next指向后一节点,当插入的位置为第一个时 让插入元素为链表头head 然后再令原本的head为当前head的下一项指针,
当插入的元素位置不为0时,就定义一个pre为null为链表头之前的元素,并且定义一个index为0,并定义current为当前的头,然后比较position与index,如果index小于position则将pre为current,并把current指向其next,并将index++,直到index不小于position,再把新节点插入。
上代码来看下会更好,我同样在上面做了大量注释
this.insert = function (position, element) {
// 越界处理
if (position > -1 && position < length) {
var node = new Node(element)
// 当插入的位置为第一个时 让插入元素为链表头head 然后再令原本的head为当前head的下一项指针(定义current来存储原本的head)
if (position == 0) {
var current = head
head = node
head.next = current
}
// 插入的元素位置不为0时
else {
var index = 0
// 定义插入元素位置的下一项
var current = head
// 定义插入元素的上一项 刚开始为null
var pre = null
// 判断index和position 循环 如果没到位置就继续往前走 index步数 插入到1的位置走一步 2走俩步
while (index < position) {
pre = current
current = current.next
index++
}
// 将node插入
pre.next = node
node.next = current
}
// 插入后length加一
length++
}
}
移除某一位置元素
删除元素就是, 直接令上一项元素指针指向当前《删除项》的下一项指针,所以和在某一位置插入元素类似,下面放代码,注释已经写在上面了
this.removeAt = function (position) {
// 错误处理
if (position > -1 && position < length) {
// 删除链表头 直接让链表头为链表头的下一项指针
if (position == 0) {
var current = head
head = current.next
} else {
var index = 0
// 定义删除元素位置的下一项
var current = head
// 定义插入元素的上一项 刚开始为null
var pre = null
// 判断index和position 循环 如果没到位置就继续往前走 index步数 插入到1的位置走一步 2走俩步
while (index < position) {
pre = current
current = current.next
index++
}
// 删除元素 直接令上一项元素指针指向当前《删除项》的下一项指针
pre.next = current.next
}
// 删除后长度减一
length--
return current
}
return '位置错误'
}
查找元素位置
就是通过比较输入的参数是否和链表中的是否相等,如果不相等就继续比较下一个,直到相等,或者next为空时
this.indexOf=function(element){
var index=0
var current =head
// 循环比较出来位置 当current存在时
while(current){
if(element==current.element){
return index
}else{
current=current.next
index++
}
}
// 没查找到
return -1
}
根据元素删除链表元素
既然已经有了查找元素返回位置,和根据位置删除元素,我们是不是可以把俩者结合下,就会产生一些奇妙的化学反应啊🥰,所以可以是根据我们的元素来删除元素只需要调用即可
this.remove=function(element){
return this.removeAt(this.indexOf(element))
// 不需要写length--了 已经在removeAt减过了
}
其他方法
接下来就是几个通过length来实现的方法了
// 检查链表是否为空
this.isEmpty=function(){
return length==0
}
// 链表长度
this.size=function(){
return length
}
this.getHead = function () {
return head
}
接下来就到了测试环节了,搞里头
var ll = new linkedList()
ll.append(1)
ll.append(2)
ll.append(3)
ll.insert(0, 'xi')
ll.insert(2, 'kk')
xi插入到了第0位,所以第一个是xi,第二个才是1,第三个是插入的kk,然后是依次插入的2,3
删一个kk看看
这里kk不见了,它的位置也让2替代了
再插入一个pp试试
经过这些测试本链表基本完成,如果有人有兴趣的话,可以继续实现双向链表以及循环链表等,感谢你的观看啊😋,我是王好人,下次见