JS实现线性表的链式表示方法示例【经典数据结构】


Posted in Javascript onApril 11, 2017

本文实例讲述了JS实现线性表的链式表示方法。分享给大家供大家参考,具体如下:

从上一节可以,顺序存储结构的弱点就是在插入或删除操作时,需要移动大量元素。所以这里需要介绍一下链式存储结构,由于它不要求逻辑上相邻的元素在物理位置上也相邻,所以它没有顺序存储结构的弱点,但是也没有顺序表可随机存取的优点。

下面介绍一下什么是链表

线性表的链式存储结构用一组任意的存储单元存储线性表的数据元素。所以,每一个数据元素除了存储自身的信息之外,还需要存储一个指向其后继的存储位置的信息。这两部分信息组成了元素的存储映像,称为结点

结点包括两个域:数据域指针域

数据域是元素中存储数据元素的信息。

指针域是元素中存储的后继存储位置的信息。

n个结点链接成为链表,就是线性表的链式存储结构,又由于此链表的每个结点中只包含一个指针域,所有又称为线性链表或单链表

举一个例子

JS实现线性表的链式表示方法示例【经典数据结构】

上图表示的线性表为

ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG

这样应该就好理解多了吧。

下面我们通过js代码来实现链表的插入和删除还有查找操作

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<script type = "text/javascript">
 var Node = function(newData){//创建节点对象
 this.next = null;
 this.data = null;
 this.Init = function(){
  this.data = newData;
 };
 this.Init();
 }
 //定义链表类
 var List = function(){
 this.head = null;
 this.size = 0;
 this.Init = function(){
  this.head = null;
  this.size = 0;
 }
 this.Init();
 this.Insert = function(newData){//初始批量插入操作
  this.size += 1;
  var newNode = new Node(newData);
  if(this.head == null){
  this.head = newNode;
  return;
  }
  var tempNode = this.head;
  while(tempNode.next != null)
  tempNode = tempNode.next;//找到链表尾部
  tempNode.next = newNode;//将新元素插入到链表尾部
 };
 this.GetData = function(pos){//查找操作
  if(pos >= this.size || pos < 0)
  return null;
  else{
  tempNode = this.head;
  for(i = 0;i < pos;i++)
   tempNode = tempNode.next; //找到所处位置
  return tempNode.data;
  }
 };
 this.Remove = function(pos){//移除某一位置节点
  if(pos >= this.size || pos < 0)
  return null;
  this.size -= 1;
  tempNode = this.head;
  if(pos == 0){
  this.head = this.head.next;
  return this.head;
  }
  for(i = 0;i < pos - 1;i++){
  tempNode = tempNode.next;
  }
  tempNode.next = tempNode.next.next;
  return tempNode.next;
 };
 this.InsertBefore=function(data,pos){//从某一位置前插入节点
  if(pos>=this.size||pos<0)
  return null;
  this.size+=1;
  tempNode=this.head;
  var newNode = new Node(data);//将数据创造节点
  if(pos==0){
  newNode.next=tempNode;
  return newNode.next;
  }
  for(i=0;i<pos-1;i++){
  tempNode=tempNode.next;//找到插入的位置
  }
  newNode.next=tempNode.next;//插入操作
  tempNode.next=newNode;
  return newNode.next;
 };
 this.Print = function(){//输出
  document.write("链表中元素: <br>");
  tempNode = this.head;
  while(tempNode != null){
  document.write(tempNode.data + " ");
  tempNode = tempNode.next;
  }
  document.write("<br>");
 };
 };
 //运行测试:
 var list = new List();
 var array = new Array(1,2,3,4,5,6);
 for(i = 0;i < array.length;i++){
 list.Insert(array[i]);
 }
 list.Print();
 document.write("查找操作下标为4的元素: <br>");
 var data= list.GetData(4);
 document.write(data+"<br>");
 document.write("删除操作: <br>");
 list.Remove(5);
 list.Print();
 document.write("插入操作: <br>");
 list.InsertBefore(8,3);
 list.Print();
 document.write("链表大小: " + list.size);
</script>
</head>
<body>
</body>
</html>

运行得到结果为

JS实现线性表的链式表示方法示例【经典数据结构】

先分析一下插入和删除的代码。

this.InsertBefore=function(data,pos){//从某一位置前插入节点
  if(pos>=this.size||pos<0)
    return null;
  this.size+=1;
  tempNode=this.head;
  var newNode = new Node(data);//将数据创造节点
  if(pos==0){
    newNode.next=tempNode;
    return newNode.next;
  }
  for(i=0;i<pos-1;i++){
    tempNode=tempNode.next;//找到插入的位置
  }
    newNode.next=tempNode.next;//插入操作
    tempNode.next=newNode;
  return newNode.next;
};
this.Remove = function(pos){//移除某一位置节点
      if(pos >= this.size || pos < 0)
       return null;
      this.size -= 1;
      tempNode = this.head;
      if(pos == 0){
       this.head = this.head.next;
       return this.head;
      }
      for(i = 0;i < pos - 1;i++){
       tempNode = tempNode.next;
      }
      tempNode.next = tempNode.next.next;
      return tempNode.next;
};

可以看出,插入和删除的世界复杂度都为o(n)。因为在第i个结点前插入或删除都得找到第i-1个元素。

再来看看初始化方法Insert,

this.Insert = function(newData){//初始批量插入操作
      this.size+= 1;
      var newNode = new Node(newData);
      if(this.head == null){
       this.head = newNode;
       return;
      }
      var tempNode = this.head;
      while(tempNode.next != null)
       tempNode = tempNode.next;//找到链表尾部
      tempNode.next= newNode;//将新元素插入到链表尾部
};

初始的插入Insert方法的时间复杂度也是o(n)。

下面介绍一下另外一种形式的链式存储结构,就是循环链表。它的特点就表中的最后一个结点的指针域指向头结点,整个链表形成一个环。有时候,在循环链表中设立尾指针而不设立头指针,可以简化操作。比如两个线性表集合为一个表时,仅需将一个表的表尾和另一个表的表头相接。这个操作的时间复杂度是o(1)。

如下图所示

JS实现线性表的链式表示方法示例【经典数据结构】

上面介绍的链表只能通过某个结点出发寻找后面的结点。也就是说在单链表中,寻找下一结点的时间复杂度为o(1),而寻找上一结点的时间复杂度为o(n)。为了克服单链表这种单向性的缺点,可以利用双向链表

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JSON 数据格式介绍
Jan 13 Javascript
JavaScript初学者建议:不要去管浏览器兼容
Feb 04 Javascript
简要了解jQuery移动web开发的响应式布局设计
Dec 04 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
Dec 26 Javascript
原生js配合cookie制作保存路径的拖拽
Dec 29 Javascript
JavaScript进阶练习及简单实例分析
Jun 03 Javascript
Angularjs CURD 详解及实例代码
Sep 14 Javascript
使用微信小程序开发前端【快速入门】
Dec 05 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
Aug 22 Javascript
微信小程序开发注意指南和优化实践(小结)
Jun 21 Javascript
基于js实现逐步显示文字输出代码实例
Apr 02 Javascript
JS正则表达式常见函数与用法小结
Apr 13 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
Apr 11 #Javascript
基于vuejs实现一个todolist项目
Apr 11 #Javascript
vue实现todolist单页面应用
Apr 11 #Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
Apr 11 #Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
Apr 11 #Javascript
javascript数组去重常用方法实例分析
Apr 11 #Javascript
JS实现针对给定时间的倒计时功能示例
Apr 11 #Javascript
You might like
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
PHP通用检测函数集合
2011/02/08 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
Yii安装与使用Excel扩展的方法
2016/07/13 PHP
Javascript 强制类型转换函数
2009/05/17 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
来自国外的页面JavaScript文件优化
2010/12/08 Javascript
用JQUERY增删元素的代码
2012/02/14 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
python33 urllib2使用方法细节讲解
2013/12/03 Python
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
详谈python http长连接客户端
2017/06/12 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
python中xlrd模块的使用详解
2021/02/01 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
白色公司:The White Company
2017/10/11 全球购物
印度网上药店:1mg
2017/10/13 全球购物
高职助产应届生自荐信
2013/09/24 职场文书
我的五年职业生涯规划
2014/01/23 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
经理任命书模板
2014/06/06 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
法人授权委托书
2014/09/16 职场文书