IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> js-数据结构-链表 -> 正文阅读

[数据结构与算法]js-数据结构-链表


个人博客: http://xiaolan1.icu


一、链表

1、概念

??链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。(即在数据逻辑上是线性的),它的每个结点由两个域组成:①存储数据元素的数据域。②存储下一个结点地址的指针域。

2、特点

??①和线性表相比,链表在添加和删除结点上的效率更高,只需要修改指针信息即可完成操作,不用像线性表(数组)那样移动元素。链表操作的时间复杂度仅为O(1)。

??②因为链表在内存中不是连续存储的,所以可以充分利用内存中的碎片空间。

??③链表的长度在理论上是无限的,可以动态变化长度。

??④哈希表是基于链表来实现的

二、链表类型

1、单链表

在这里插入图片描述

function LinkedList(){
    let Node=function (element){
        this.element = element
        this.next = null
    }
    
    let head = new Node('head')
    
    //查找返回最后一个节点
    this.findLast = function (){
        let currNode = head
        while (currNode.next){
            currNode = currNode.next
        }
        return currNode
    }
    
    //在尾部增加元素
    this.append = function (element){
        let newNode = new Node(element)
        let currNode = this.findLast()
        if(!head){
            head = newNode	//头节点为空的情况
        }else{
            currNode.next = newNode
        }
    }
    
    //查找item元素
    this.find = function(item){
        let currNode = head
    	while(currNode.next&&currNode.element!=item){
            currNode = currNode.next
        }
        return currNode
    }
    
    //插入元素
    this.insert = function(item, element){
        let itemNode = this.find(item)
       
        if(!itemNode){
            return 
        }
        let newNode = new Node(element)
        
        newNode.next = itemNode.next
        itemNode.next = newNode
    }
    
    //删除节点
    this.remove = function(item){
       let currNode = head
       while(currNode.next.element!==item){
           if(!currNode.next){
               return 
           }
           currNode = currNode.next
       }
        currNode.next=currNode.next.next
    }
      //打印链表元素
      this.display = function () {
          let result = []
          let currNode = head
          while (currNode ) {
              result.push(currNode.element)
              currNode = currNode.next
          }
          return result
      }
}


//测试部分:
let myList = new LinkedList()
let arr = [1, 4, 5, 2, 3]
for (i of arr) {
    myList.append(i)
}
console.log(myList.display());	//['head', 1, 4, 5, 2, 3]
console.log(myList.find(5));    //Node{element:5,next:Node}
console.log(myList.findLast()); //Node{element:3,next:null}
console.log(myList.remove(4));
console.log(myList.display());  //["head", 1, 5, 2, 3]

2、双链表

在这里插入图片描述

function doubleLinkedList(){
    let Node = function (element){
        this.element = element
        this.next = null
        this.previous = null
    }
    let head = new Node('head')
    
    //查找最后一个节点
    this.findLast = function(){
        let currNode = head
        while(currNode.next){
            currNode = currNode.next
        }
        return currNode
    }
    
    //查找特定元素节点
    this.find = function(item){
        let currNode = head
        while(currNode.element != item){
            if(currNode.next == null){
                return 
            }
            currNode = currNode.next
        }
        return currNode
    }
    
    //在某节点后插入一个新节点
    this.insert = function(item,element){
        let currNode = this.find(item)
        let newNode = new Node(element)
        
        if(currNode = null){
            return
        }
        if(currNode.next == null){
            currNode.next = newNode
            newNode.previous = currNode
        }else{
            newNode.next = currNode.next
            currNode.next.previous = newNode
            currNode.next = newNode
            newNode.previous = currNode
        }
    }
    
    //在尾结点插入元素
    this.append = function(element){
        let newNode = new Node(element)
        let currNode =this.findLast()
        if(!head){
            head = newNode
        }else{
            currNode.next = newNode
            newNode.previous =currNode
        }
    }
	
    //删除某节点
    this.remove = function(item){
        let currNode = this.find(item)
        if(!currNode){
            return
        }
        if(currNode.next != null &&  currNode.previous != null){  //该节点前后节点都不为空
        	currNode.previous.next = currNode.next
        	currNode.next.previous = currNode.previous
        	currNode.next = null
        	currNode.previous = null
        }else if(currNode.previous == null){   //该节点的前一节点为空
            head = currNode.next
            currNode.next.previous = null
            currNode.previous = null
        }else if(currNode.next == null){     //该节点的后一节点为空
            currNode.previous.next = null
            currNode.previous = null
        }
    }
     //打印链表元素
     this.display = function () {
          let result = []
          let currNode = head
          while (currNode) {
              result.push(currNode.element)
              currNode = currNode.next
          }
          return result
      }
}

//测试部分
let myList = new doubleLinkedList()
let arr = [1, 4, 5, 2, 3]; 
for (i of arr) {
    myList.append(i)
}
console.log(myList.display());  //['head', 1, 4, 5, 2, 3]
console.log(myList.find(5))		//Node{element:5,next:Node,previous:Node}
console.log(myList.remove(4));
console.log(myList.display());	//["head", 1, 5, 2, 3]
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:44:30  更:2021-10-20 12:45:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:43:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码