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 相关文章推荐
javascript之Partial Application学习
Jan 10 Javascript
js实现图片从左往右渐变切换效果的方法
Feb 06 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
Dec 08 Javascript
详解JavaScript跨域总结与解决办法
Oct 31 Javascript
jQuery实现背景滑动菜单
Dec 02 Javascript
JS实现常见的查找、排序、去重算法示例
May 21 Javascript
详解在React中跨组件分发状态的三种方法
Aug 09 Javascript
electron + vue项目实现打印小票功能及实现代码
Nov 25 Javascript
vue实现动态按钮功能
May 13 Javascript
基于JavaScript实现留言板功能
Mar 16 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
Jun 15 Javascript
Vue时间轴 vue-light-timeline的用法说明
Oct 29 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
PHP中list()函数用法实例简析
2016/01/08 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
2018/12/21 PHP
wordpress之js库集合研究介绍
2007/08/17 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
python常见的格式化输出小结
2016/12/15 Python
django站点管理详解
2017/12/12 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
linux面试题参考答案(4)
2013/01/28 面试题
驾驶员安全责任书
2014/07/22 职场文书
2014年测量员工作总结
2014/12/12 职场文书
2015年工会工作总结
2015/03/30 职场文书
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP