JavaScript:封装单向链表10种常见的操作方法

news2024/11/25 19:18:03

链表的优势
1.要存储多个元素的时候,除了数组还可以选择链表。
2.与之数组不同的是,链表中的元素在内存中不必是连续的空间。
3.链表中的每个元素由一个存储元素本身的节点和一个指向下一个节点的引用(指针或者连接)组成。

相比于数组,链表有一些优点:
1.内存空间不用是连续的,这样可以充分利用计算机的内存,实现灵活的内存动态管理。
2.链表不用在创建的时候就确定大小,并且大小可以无限的延伸下去。
3.链表在插入和删除元素时,时间复杂度可以达到O(1),相对于数组的时间复杂度来说效率更高。

单项链表常见的操作方法

1.append方法
在这里插入图片描述

LinkedList.prototype.append = function(data) {
  // 创建一个新节点
  var newNode = new Node(data)

  // 判断是否添加的是第一个节点
  if(this.length == 0){
    // 是第一个节点
    // var newNode = new Node(data)
    this.head = newNode
  } else {
    // 不是第一个节点-->找到最后一个节点
    // var newNode = new Node(data)
    var current = this.head
    while(current.next) {
      current = current.next
    }

  // 最后节点的next指向新的节点
  current.next = newNode
}

// length+1
this.length += 1

2.toString方法
在这里插入图片描述

LinkedList.prototype.toString = function() {
  // 定义变量
  var current = this.head
  var 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
  }
  // 根据data创建newNode
  var newNode = new Node(data)

  // 判断插入的位置是否是第一个
  if(position == 0) {
	newNode.next = this.head
	this.head = newNode
  } else {
	// 插入中间和最后通用的插入方法
	var index = 0
	var current = this.head
	var previous = null
	while(index++ < position) {
	  previous = current
	  current = current.next
    }
    newNode.next = current
    previous.next = newNode
  }
  // length+1
  this.length += 1
  return true
}

4.get方法
在这里插入图片描述

LinkedList.prototype.get = function(position) {
  // 越界判断
  if(position<0 || position>=this.length){
	return null
  }
  // 获取对应的data
  var current = this.head
  var index = 0
  while(index++ < position) {
	current = current.next
  }
  return current.data
}

5.indexOf方法
在这里插入图片描述

LinkedList.prototype.indexOf = function(data) {
  // 定义变量
  var current = this.head
  var index = 0

  // 开始查找遍历
  while(current) {
	if(current.data == data) {
	  return index
	}
	current = current.next
	index += 1
  }
  // 找到链表最后未找到该元素,返回-1
  return -1
}

6.update方法
在这里插入图片描述

LinkedList.prototype.update = function(position,newData) {
  // 越界判断
  if(position<0 || position>=this.length) {
	return false
  }

  // 查找正确的节点
  var current = this.head
  var index = 0
  while(index++ < position) {
	current = current.next
  }

  // 将position位置的node修改为新的值newData
  current.data = newData
  return true
}

7.removeAt方法
在这里插入图片描述

LinkedList.prototype.removeAt = function(position) {
  // 越界判断
  if(position<0 || position>=this.length) {
	return false
  }

  // 判断删除的是否第一个节点
  var current = this.head
  if(position == 0) {
	this.head = this.head.next
  } else {
	var index = 0
	// var current = this.head
	var previous = null
	while(index++ < position) {
	  previous = current
	  current = current.next
	}
	// 前一个节点的next指向current即可
	previous.next = current.next
  }
  // 删除完元素后链表长度需要进行length-1
  this.length -= 1
  // 表示删除成功
  // return true
  return current.data
 }

8.remove方法
在这里插入图片描述

LinkedList.prototype.remove = function(data) {
  // 获取data在链表中的位置
  var position = this.indexOf(data)

  // 根据位置信息删除所在的节点
  return this.removeAt(position)
}

9.isEmpty方法
在这里插入图片描述

LinkedList.prototype.isEmpty = function() {
  return this.length == 0
}

10.size方法
在这里插入图片描述

LinkedList.prototype.size = function() {
  return this.length
}

完整笔记代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>单向链表的封装</title>
</head>
<body>
  <script>
    // 封装链表的类
    function LinkedList() {
      // 内部的类:节点类
      function Node(data) {
        this.data = data
        this.next = null
      }

      // 属性
      this.head = null
      this.length = 0

      // 1.append方法
      LinkedList.prototype.append = function(data) {
        // 创建一个新节点
        var newNode = new Node(data)

        // 判断是否添加的是第一个节点
        if(this.length == 0){
          // 是第一个节点
          // var newNode = new Node(data)
          this.head = newNode
        } else {
          // 不是第一个节点-->找到最后一个节点
          // var newNode = new Node(data)
          var current = this.head
          while(current.next) {
            current = current.next
          }

          // 最后节点的next指向新的节点
          current.next = newNode
        }

        // length+1
        this.length += 1

        // 2.toString方法
        LinkedList.prototype.toString = function() {
          // 定义变量
          var current = this.head
          var 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
          }
          // 根据data创建newNode
          var newNode = new Node(data)

          // 判断插入的位置是否是第一个
          if(position == 0) {
            newNode.next = this.head
            this.head = newNode
          } else {
            // 插入中间和最后通用的插入方法
            var index = 0
            var current = this.head
            var previous = null
            while(index++ < position) {
              previous = current
              current = current.next
            }
            newNode.next = current
            previous.next = newNode
          }
          // length+1
          this.length += 1
          return true
        }

        // 4.get方法
        LinkedList.prototype.get = function(position) {
          // 越界判断
          if(position<0 || position>=this.length){
            return null
          }
          // 获取对应的data
          var current = this.head
          var index = 0
          while(index++ < position) {
            current = current.next
          }
          return current.data
        }

        // 5.indexOf方法
        LinkedList.prototype.indexOf = function(data) {
          // 定义变量
          var current = this.head
          var index = 0

          // 开始查找遍历
          while(current) {
            if(current.data == data) {
              return index
            }
            current = current.next
            index += 1
          }
          // 找到链表最后未找到该元素,返回-1
          return -1
        }

        // 6.update方法
        LinkedList.prototype.update = function(position,newData) {
          // 越界判断
          if(position<0 || position>=this.length) {
            return false
          }

          // 查找正确的节点
          var current = this.head
          var index = 0
          while(index++ < position) {
            current = current.next
          }

          // 将position位置的node修改为新的值newData
          current.data = newData
          return true
        }

        // 7.removeAt方法
        LinkedList.prototype.removeAt = function(position) {
          // 越界判断
          if(position<0 || position>=this.length) {
            return false
          }

          // 判断删除的是否第一个节点
          var current = this.head
          if(position == 0) {
            this.head = this.head.next
          } else {
            var index = 0
            // var current = this.head
            var previous = null
            while(index++ < position) {
              previous = current
              current = current.next
            }
            // 前一个节点的next指向current即可
            previous.next = current.next
          }
          // 删除完元素后链表长度需要进行length-1
          this.length -= 1
          // 表示删除成功
          // return true
          return current.data
        }

        // 8.remove方法
        LinkedList.prototype.remove = function(data) {
          // 获取data在链表中的位置
          var position = this.indexOf(data)

          // 根据位置信息删除所在的节点
          return this.removeAt(position)
        }

        // 9.isEmpty方法
        LinkedList.prototype.isEmpty = function() {
          return this.length == 0
        }

        // 10.size方法
        LinkedList.prototype.size = function() {
          return this.length
        }
      }
    }
    // 测试代码
    // 创建LinkedList
    var list = new LinkedList()

    // 测试append方法
    list.append("xiaonaihu")
    list.append("hyw")
    list.append("lingxiaohu")
    alert(list)

    // 测试insert方法
    list.insert(0,"aaa")
    list.insert(3,"ccc")
    list.insert(5,"yyy")
    alert(list)

    // 测试get方法
    alert(list.get(0))
    alert(list.get(3))
    alert(list.get(5))

    // 测试indexOf方法
    alert(list.indexOf("aaa"))
    alert(list.indexOf("ccc"))
    alert(list.indexOf("yyy"))

    // 测试update方法
    list.update(0,"mmm")
    list.update(3,"nnn")
    alert(list)

    // 测试removeAt方法
    list.removeAt(0)
    alert(list)
    list.removeAt(3)
    alert(list)

    // 测试remove方法
    list.remove("nnn")
    alert(list)
    list.remove("xiaonaihu")
    alert(list)

    // 测试isEmpty方法
    alert(list.isEmpty())

    // 测试size方法
    alert(list.size())
  </script>
</body>
</html>

测试结果自己测试代码即可显示运行效果!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QGIS基础:根据字段属性值或基于规则进行分类符号化显示

以下操作是对数据进行分类符号化&#xff0c;下面是原始操作数据&#xff1a; 基于分类符号化的字段是如下所示&#xff08;ZDTZM&#xff09;: A B C D 找到数据图层&#xff0c;右键属性&#xff0c;找到【符号化】&#xff0c;点击如下所示的分类&#xff1a; 在【valu…

mysql数据库完整实例-“汽车维修”

mysql数据库创建&#xff0c;编写&#xff0c;查询&#xff0c;自定义函数实战案例 创建汽车修理数据库&#xff0c;并完成数据库编写&#xff1a; 本文分三个部分&#xff0c;第一部分为数据库的创建编写和基础查询&#xff0c;第二部分为关联查询等复杂查询方法&#xff0c…

实验四:完整性实验

【实验目的】 掌握实体完整性、参照完整性和用户自定义完整性的定义的维护方法 【实验内容】 要实现这样一个功能&#xff1a;医生根据药品价表选择处方药品&#xff0c;录入数量和使用天数&#xff0c;系统根据医生选择的药品和录入的信息自动生成处方主表和处方明细表。功能…

Flink-按键分区状态-算子状态-广播状态

文章目录1. 按键分区状态&#xff08;Keyed State&#xff09;1.2基本概念和特点1.3 支持的结构类型1.4 代码实现1.5 状态生存时间&#xff08;TTL&#xff09;2 算子状态&#xff08;Operator State&#xff09;2.1 基本概念和特点2.2 状态类型2.3 代码实现3. 广播状态&#x…

2022年安徽建筑施工塔式起重机(建筑特种作业)模拟题库及答案

百分百题库提供特种工&#xff08;塔式起重机&#xff09;考试试题、特种工&#xff08;塔式起重机&#xff09;考试真题、特种工&#xff08;塔式起重机&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 87.塔式起重机滑轮上…

基于历史对比学习的时序知识图谱推理

时序知识图谱 知识图谱&#xff08;KGs&#xff09;作为人类知识的集合&#xff0c;在自然语言处理、推荐系统和信息检索等领域显示展现了很好的前景。传统的KG通常是一个静态知识库&#xff0c;它使用图结构数据拓扑&#xff0c;并以三元组&#xff08;s, p, o&#xff09;的…

自定义ContentProvider案例

自定义ContentProvider案例 1.条件准备 app5往外暴漏数据app7接收和操作远程数据图1 app5目录结构 图2 app7目录结构 2.参考代码 完整代码&#xff1a; https://download.csdn.net/download/weixin_41957626/87346497 1)app5的代码 &#xff08;1&#xff09;app5的entity&…

C#项目实战——【实例】企业人事管理系统(一):1、系统分析;2、系统设计;3、系统运行环境;

学习《C#从入门到精通》&#xff0c;边学边练记录实现过程。 1、系统分析 1.1、需求分析 基于其他企业人事管理软件的不足&#xff0c;要求能够制作一个可以方便、快捷地对职工信息进行添加、修改、删除的操作&#xff0c;并且可以在数据库中存储相应职工的照片。为了能够更…

Magic Live智慧引擎发力,荣耀吹响智慧服务变革号角

人类的不断进步&#xff0c;核心源自对生活的“不满足”。 就在十几年前&#xff0c;诺基亚、黑莓等手机还被当做走在时代前沿的产品&#xff0c;触屏笔等设计风靡一时。但后来人们发现&#xff0c;触屏笔非常不方便&#xff0c;于是迅速被淘汰&#xff0c;更为先进的触摸屏诞…

自动控制原理笔记-二阶欠阻尼系统动态性能指标计算

目录 欠阻尼二阶系统的两种表示方法&#xff1a; 二阶欠阻尼系统单位阶跃响应&#xff1a; 二阶欠阻尼系统单位指标计算&#xff1a; 例题&#xff1a; 例题&#xff1a; 二阶系统动态性能随极点位置分布的变化规律&#xff1a; 例题&#xff1a; 欠阻尼包括零阻尼 欠阻…

【Linux04-进程概念上】两个结构的理解带你“降维打击”进程概念!

前言 本期分享Linux超重要的知识&#xff1a;进程概念&#xff01; 博主水平有限&#xff0c;不足之处望请斧正&#xff01; 要学习进程&#xff0c;我们首先得搭建宏观的计算机和操作系统结构&#xff0c;从更高的视角学习。 先导 计算机体系结构 使用最多提及最多的计算…

【软件测试】从事5年资深测试的经验,少走弯路......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 小张&#xff1a; 工…

SSIS中刷新Power BI数据集

前面介绍过了怎么在Azure云中刷新Power BI数据集&#xff0c;感兴趣的可以阅读 数据工厂中刷新PowerBI数据集 数据工厂刷新PowerBI数据集2 但有很多公司可能并没有完全上云&#xff0c;比如某些公司还在使用SSIS调用ETL工程&#xff0c;那么有没有办法在本地也实现执行完SSI…

双11购物的凑单问题与财务凑数问题

&#x1f4e2;作者&#xff1a; 小小明-代码实体 &#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/as604049322 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 欢迎讨论&#xff01; &#x1f4e2;本文链接&#xff1a;https://xxmdmst.blog.csdn.n…

Chapter3 P-N Junction

3-2 热平衡状态 电流只在一个方向很容易通过&#xff0c;正方向很容易通过电流&#xff0c;负方向很不容易 正电压加在Ptype上才会有电流 就会产生如图b的现象 electron 一定要从high concentration移动到low concentration 所以两个的移动方向如图所示 靠近junction附近&…

C#中window窗体和控件

C#中window窗体和控件 布局与事件–界面的基本问题 布局 就是拉动窗体的时候&#xff0c;按钮也在跟着变动。 事件 //简单的计算器 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespa…

Web API事件高级部分

1、注册事件&#xff08;2种方式&#xff09; 给元素添加事件&#xff0c;称为 注册事件 或者 绑定事件 注册事件有两种方式&#xff1a;传统方式 和 监听注册方式 传统注册方式&#xff1a; 利用on开头的事件 onclick<button οnclick"alert(hi~)"></b…

供应化学试剂mPEG-Biotin,甲氧基-聚乙二醇-生物素

一&#xff1a;产品描述 1、名称 英文&#xff1a;mPEG-Biotin 中文&#xff1a;甲氧基-聚乙二醇-生物素 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Biotin PEG Methoxy PEG 4、分子量&#xff1a;可定制1k、2k、3.4k、10k、20k、5k 5、质量控制&#xff1a;95…

shell脚本四剑客--sed的应用

sed的介绍 sed是Linux下一款功能强大的非交互流式文本编辑器&#xff0c;可以对文本文件进行增、删、改、查等操作&#xff0c;支持按行、按字段、按正则匹配文本内容&#xff0c;灵活方便&#xff0c;特别适合于大文件的编辑 sed在处理文本时是逐行读取文件内容&#xff0c;…

TCP协议中的几个核心特性

目录 引言 TCP协议 &#x1f351;TCP 与 UDP 的 区别 &#x1f351;TCP客户端和服务器建立连接的三次握手 &#x1f351;TCP客户端和服务器断开连接的四次挥手 &#x1f351;滑动窗口 &#x1f351;流量控制 &#x1f351;拥塞控制 引言 还记得那个经典的图吗&#x…