JS数据结构——链表

链表

类似于火车节 有指针链接两个数据,每个数据"块"都有一个指和指向下一个数据的next指针

创建链表
//首先需要一个存放数据的node,里面包含当前数据的指和指向下一个数据的指针
class Node{
    constructor(element){
        this.element = value
        this.next = undefined
    }
}
//创建链表
class LinkList{
    consturctor(){
    this.count = 0
    this.head = undefined
    }
}
常见的方法
  1. 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++
}
  1. insert(element,position):向链表特定位置插入一个新元素
  2. getElementAt(index):返回链表中特定位置的元素,如果不存在就是undefined
  3. remove(element):从链表中移除一个元素
  4. indexOf(element):返回需要的元素的索引,如果没有找到,会返回-1
  5. removeAt(element):从链表中特定位置移除一个元素
  6. isEmpty():如果链表中不包含任何元素,直接返回true
  7. size():返回链表的元素个数
  8. toString:将链表以字符串返回

基本思路

  1. 无论添加还是删除,首先都要检查链表是不是空的,如果是的话 就直接进行操作
  2. 如果不是空的,会分为三种情况:
    (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 //新增的往前的指针
    }
}
添加元素
  1. 在开头添加:如果已经有元素的情况下,引入一个新的指针,指向旧的元素,令旧元素的prev指向新元素,令新元素next指针指向旧元素,且head指向新元素,新元素prev设置为null
  2. 在结尾添加:找到最后一个元素,令最后一个元素的next指向新元素node;新元素prev指向旧元素,next指向null
  3. 在中间任意位置添加:这里需要两个指针,首先找到要添加的位置的前一元素设置为previous,将previous.next指向新元素node,node.prev指向previou,node.next指向下一个元素current
删除元素

与上逻辑类似

循环链表

表示最后一个元素会指向第一个元素head

循环单向链表

直接最后一个元素指向第一个元素

循环双向链表

因为一个元素有两个指针,所以第一个元素head的prev指向最后一个元素,最后一个元素的next指向第一个元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值