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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> JavaScript【数据结构与算法】(二) 单向链表 -> 正文阅读

[数据结构与算法]JavaScript【数据结构与算法】(二) 单向链表

个人博客地址:https://tao-yuhan.gitee.io/tyhanblog/
在这里插入图片描述

链表的优势

  • 链表中的元素在内存中不必是连续的空间
  • 链表的每一个元素由一个存储元素本身的节点和一个指向下一个元素的引用
  • 链表在创建的时候不需要确定大小,大小可以无线延伸下去

单向链表的一些基本操作

链表得有一个head指向第一个节点,其次每个节点中有data和next,next指向下一个节点

  • append(element): 在尾部添加一个新的项
  • insert(position,ele): 向链表的特定位置插入一个新的项
  • get(position): 获取对应位置的元素
  • indexOf(ele): 返回元素在链表中的索引,如果没有该元素则返回-1
  • update(position,ele): 修改某个位置的元素
  • removeAt(position): 从列表的特定位置移除一项
  • remove(ele): 从链表中移除一项
  • isEmpty(): 是否为空
  • size(): 链表长度
  • toString(): 输出元素的值

链表操作的封装

链表的基本实现

function LinkedList() {
 this.head = null
 this.length = 0

 //节点类
 function Node(data) {
   this.data = data
   this.next = null
 }
}

1.append

LinkedList.prototype.append = function (data) {
  //先创建这个节点
  let newNode = new Node(data)
  //如果添加的为第一个节点,将head指针指向该节点的data
  if (this.length == 0) {
    this.head = newNode
  } else {
    let current = this.head
    while (current.next) {
      //找下一个
      current = current.next
    }
    //最后节点的next指向新的节点
    current.next = newNode
  }
  this.length++
}

2.insert

LinkedList.prototype.insert = function (position, data) {
  //对position进行越界判断和长度判断
  if (position < 0 || position > this.length) return false

  //创建节点
  let newNode = new Node(data)
  //如果是插入在第一个
  if (position == 0) {
    newNode.next = this.head
    this.head = newNode
  } else { //如果不是插入第一个
    let index = 0 //自己定义一个位置
    let current = this.head //先让current为第一个节点
    while (index++ < position - 1) { //3
      current = current.next
    }
    newNode.next = current.next
    current.next = newNode
  }
  this.length++
  return true
}

3.get

LinkedList.prototype.get = function (position) {
  //对position进行越界判断和长度判断
  if (position < 0 || position >= this.length) return false

  //创建一个空的字符用来接收
  let str = ""
  let index = 0 //自己定义一个位置
  let current = this.head //先让current为第一个节点
  while (index++ < position) {
    current = current.next
  }
  str += current.data
  return str
}

4.indexOf

LinkedList.prototype.indexOf = function (data) {
  //从第一个开始找
  let index = 0
  //一个链表中可能存在几个相同的几个值,将其位置全部存放在一个数组中
  let arr = []
  let current = this.head
  while (index < this.length) {
    //符合的位置全部push到数组中
    if (current.data == data) {
      arr.push(index)
    }
    current = current.next
    index++
  }
  // return index
  // 循环结束后再根据数组中的数来做判断
  if (arr.length == 0) {
    return -1
  } else if (arr.length == 1) { //如果只有一个的话就不返回数组,直接返回这个位置
    return arr[0]
  } else {
    return arr
  }
}

5.update

LinkedList.prototype.update = function (position, data) {
  //对position进行越界判断和长度判断
  if (position < 0 || position >= this.length) return false

  let index = 0 //自己定义一个位置
  let current = this.head //先让current为第一个节点
  while (index++ < position) {
    current = current.next
  }
  current.data = data
}

6.removeAt

LinkedList.prototype.removeAt = function (position) {
  //对position进行越界判断和长度判断
  if (position < 0 || position >= this.length) return false

  let index = 0 //前一个的位置
  let current = this.head //先让current为第一个节点
  //如果删除的是第一个节点
  if(position === 0) {
    this.head = this.head.next 
  }else {
    while (index++ < position - 1) {//找到要删除节点的前一个节点
      current = current.next
    }
        /**
   * 将链表断开
   */
    let mid = current.next
    current.next = mid.next
    mid.next = null
  }
  this.length -= 1
  return true
}

7.remove

LinkedList.prototype.remove = function(ele) {
  //直接调用indexOf()与removeAt()
  const position = this.indexOf(ele)
  console.log(position);
  if(position === -1) {
    return false
  }else if(position instanceof Array) {
    position.forEach((item) => {
      this.removeAt(item)
      this.remove(ele)
    })
  }else {
    this.removeAt(position)
  }
  return true
}

8.toString

LinkedList.prototype.toString = function () {
 let current = this.head
 let listString = ""
 while (current) {
   listString += current.data + " "
   current = current.next
 }
 return listString
}

完整代码实现

function LinkedList() {
  this.head = null
  this.length = 0

  //节点类
  function Node(data) {
    this.data = data
    this.next = null
  }

  //1.追加方法
  LinkedList.prototype.append = function (data) {
    //先创建这个节点
    let newNode = new Node(data)
    //如果添加的为第一个节点,将head指针指向该节点的data
    if (this.length == 0) {
      this.head = newNode
    } else {
      let current = this.head
      while (current.next) {
        //找下一个
        current = current.next
      }
      //最后节点的next指向新的节点
      current.next = newNode
    }
    this.length++
  }

  //2.toString方法
  LinkedList.prototype.toString = function () {
    let current = this.head
    let listString = ""
    while (current) {
      listString += current.data + " "
      current = current.next
    }
    return listString
  }

  //3.insert方法
  LinkedList.prototype.insert = function (position, data) {
    //对position进行越界判断和长度判断
    if (position < 0 || position > this.length) return false

    //创建节点
    let newNode = new Node(data)
    //如果是插入在第一个
    if (position == 0) {
      newNode.next = this.head
      this.head = newNode
    } else { //如果不是插入第一个
      let index = 0 //自己定义一个位置
      let current = this.head //先让current为第一个节点
      while (index++ < position - 1) { //3
        current = current.next
      }
      newNode.next = current.next
      current.next = newNode
    }
    this.length++
    return true
  }

  //4.get方法
  LinkedList.prototype.get = function (position) {
    //对position进行越界判断和长度判断
    if (position < 0 || position >= this.length) return false

    //创建一个空的字符用来接收
    let str = ""
    let index = 0 //自己定义一个位置
    let current = this.head //先让current为第一个节点
    while (index++ < position) {
      current = current.next
    }
    str += current.data
    return str
  }

  //5.update方法
  LinkedList.prototype.update = function (position, data) {
    //对position进行越界判断和长度判断
    if (position < 0 || position >= this.length) return false

    let index = 0 //自己定义一个位置
    let current = this.head //先让current为第一个节点
    while (index++ < position) {
      current = current.next
    }
    current.data = data
  }

  //6.indexOf方法
  LinkedList.prototype.indexOf = function (data) {
    //从第一个开始找
    let index = 0
    //一个链表中可能存在几个相同的几个值,将其位置全部存放在一个数组中
    let arr = []
    let current = this.head
    while (index < this.length) {
      //符合的位置全部push到数组中
      if (current.data == data) {
        arr.push(index)
      }
      current = current.next
      index++
    }
    // return index
    // 循环结束后再根据数组中的数来做判断
    if (arr.length == 0) {
      return -1
    } else if (arr.length == 1) { //如果只有一个的话就不返回数组,直接返回这个位置
      return arr[0]
    } else {
      return arr
    }
  }

  //7.removeAt(position)
  LinkedList.prototype.removeAt = function (position) {
    //对position进行越界判断和长度判断
    if (position < 0 || position >= this.length) return false

    let index = 0 //前一个的位置
    let current = this.head //先让current为第一个节点
    //如果删除的是第一个节点
    if(position === 0) {
      this.head = this.head.next 
    }else {
      while (index++ < position - 1) {//找到要删除节点的前一个节点
        current = current.next
      }
          /**
     * 将链表断开
     */
      let mid = current.next
      current.next = mid.next
      mid.next = null
    }
    this.length -= 1
    return true
  }

  //8.remove()
  LinkedList.prototype.remove = function(ele) {
    //直接调用indexOf()与removeAt()
    const position = this.indexOf(ele)
    console.log(position);
    if(position === -1) {
      return false
    }else if(position instanceof Array) {
      position.forEach((item) => {
        this.removeAt(item)
        this.remove(ele)
      })
    }else {
      this.removeAt(position)
    }
    return true
  }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:43:11  更:2021-08-21 15:45:57 
 
开发: 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/25 23:13:25-

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