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 document.compatMode兼容性
Feb 23 Javascript
JSQL 基于客户端的成绩统计实现方法
May 05 Javascript
Lazy Load 延迟加载图片的jQuery插件中文使用文档
Oct 18 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
Mar 18 Javascript
ActiveX控件与Javascript之间的交互示例
Jun 04 Javascript
11种ASP连接数据库的方法
Sep 18 Javascript
教你5分钟学会用requirejs(必看篇)
Jul 25 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
May 23 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
Sep 03 Javascript
vue中接口域名配置为全局变量的实现方法
Sep 20 Javascript
angular 实现同步验证器跨字段验证的方法
Apr 11 Javascript
javascript实现多边形碰撞检测
Oct 24 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
客户端静态页面玩分页
2006/06/26 Javascript
filemanage功能中用到的lib.js
2007/04/08 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
将文本输入框内容加入表中的js代码
2013/08/18 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
2016/12/19 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
import与export在node.js中的使用详解
2017/09/28 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
python3中数组逆序输出方法
2020/12/01 Python
实例讲解CSS3中的box-flex弹性盒属性布局
2016/06/09 HTML / CSS
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
医学生职业生涯规划书范文
2014/03/13 职场文书
孩子教育的心得体会
2014/09/01 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
2019销售早会主持词
2019/06/27 职场文书
JavaScript实现简单计时器
2021/06/22 Javascript
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
教你nginx跳转配置的四种方式
2022/07/07 Servers