0
点赞
收藏
分享

微信扫一扫

数据结构---链表

链表

本次我将使用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试试
在这里插入图片描述
经过这些测试本链表基本完成,如果有人有兴趣的话,可以继续实现双向链表以及循环链表等,感谢你的观看啊😋,我是王好人,下次见

举报

相关推荐

0 条评论