Javascript数据结构与算法学习(三)—— 链表

什么是链表

  • 看似火车~
  • 特点:链表里的每一项除了包含自己的信息外,还包含有下一项(next)的数据内容。
  • 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的每个元素有一个存储元素本身的节点和一个指向下一个元素的引用组成。
  • 数据结构: {element:'元素内容', next:null} ,next指向下一项(实现需要借助一个辅助类)
    单向链表

链表的操作

以下以单向链表为例:
特点:

每个节点(node)都由数据本身和一个指向后续节点的指针组成
整个链表的存取必须从头指针开始,头指针指向第一个节点
最后一个节点的指针指向空(NULL)

  • 操作
  • 获取元素索引:indexOf
  • 尾部添加元素:append
  • 插入元素:insert(position,element)
  • 从链表中移除一项:remove(element)
  • 从链表中特定位置移除一项:removeAt(positon)
  • 是否为空:isEmpty
    在这里插入图片描述
var LinkedList = function(){
    // 链表头
    var head = null
    // 链表长度 
    var length = 0
    // 辅助类
    var Node = function(elem){
        this.elem = elem
        this.next = null
    }
    // 添加元素
    this.append = function(el){
        var node = new Node(el)
        if(head===null){
            head = node 
        }else{
            var current= head;
            while(current.next){
                current = current.next
            }
            current.next=node
        }
        length ++;
    }
    // 插入
    this.insert = function(position,element){
        var current = head
        var node = new Node(element)
        if(position===0){
            head = element
            head.next = current
        }else{
            var index = 0
            var previous= null
            while(index<position){
                previous = current
                current = current.next
                index++
            }
            previous.next = node
            node.next = current
        }
        length ++
    }
    // 删除
    this.removeAt = function(position){
        if(position>-1&&position<length){
            // 删除首位
            if(position===0){
                var current = head
                head = current.next
            }else{
                // 删除其他位置
                var previous = null
                var current = head
                var index = 0
                while(index<position){
                    previous=current
                    current = current.next
                    index++
                }
                // 跳出循环时,index === position
                previous.next = current.next
            }
        }
        length --;
        return current
    }
    // 获取元素位置
    this.indexOf = function (ele){
        var index =0 
        var current = head
        while(current){
            if(ele === current.elem){
                return index
            }
            index ++ 
            current = current.next
        }
        return -1
    }
    this.remove = function(elem){
        return this.removeAt(this.indexOf(elem))
    }
    this.isEmpty = function(){
        return length ===0 
    }
    this.size = function(){
        return length
    }
    this.printHead = function(){
        console.log(head) 
    }
}

var l = new LinkedList()
l.append(1)
l.append(2)
l.append(3)
l.insert(1,6)
l.printHead()

加强链表

双向链表

  • 特点:含有previous指向上一项,next指向下一项,
    在这里插入图片描述

循环链表

  • 特点:链表尾部指向链表头
    在这里插入图片描述
  • 应用场景:轮播图
发布了114 篇原创文章 · 获赞 146 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/Sophie_U/article/details/103805031