数据结构学习系列之线性表(五)

前言

单向链表查找下一个元素很方便,要查找上一个元素时,需要从头开始向下遍历,很是麻烦。如何解决这个问题呢?使用双向链表结构可以解决这个问题。

双向链表

在单向链表的基础上,增加一个指向上一个节点的指针,这就形成了双向链表结构。因增加了一个指针域,故需要占用更多的内存空间,换就话说,用空间换时间。现在硬件越来越强,而价格越来越低,这种思想的应用案例越来越普遍。

代码实现

  1 /**
  2  * @desc 双向链表
  3  *
  4  * @date 2015/08/23
  5  * @copyright by WadeYu
  6  */
  7 var DblLinkListAdt = function(){
  8     this.head = this.node(0);
  9     this.init();
 10 };
 11 DblLinkListAdt.prototype.node = function(data){
 12     return {
 13         data:data,
 14         prev:null,
 15         next:null
 16     };
 17 };
 18 DblLinkListAdt.prototype.init = function(){
 19     return true;
 20 };
 21 DblLinkListAdt.prototype.insert = function(i,node){
 22     i = i -1;
 23     if( (i < 0) || (i > this.getLength())){
 24         return false;
 25     }
 26     var pos = 0;
 27     var node1 = this.head,tmp;
 28     while(true){
 29         if(pos == i){//找到第i-1个节点
 30             break;
 31         }
 32         node1 = node1.next;
 33         pos++;
 34     }
 35     node.prev = node1;
 36     node.next = node1.next;
 37     node1.next.prev = node;
 38     node1.next = node;
 39     return true;
 40 };
 41 DblLinkListAdt.prototype.delete = function(i){
 42     if((i < 1) || (i > this.getLength())){
 43         return false;
 44     }
 45     var pos = 1;
 46     var node1 = this.head;
 47     while(true){
 48         if(pos == (i-1)){
 49             break;
 50         }
 51         node1 = node1.next;
 52     }
 53     var node2 = node1.next;
 54     node2.next.prev = node1;
 55     node1.prev = node2.next;
 56     return true;
 57 };
 58 DblLinkListAdt.prototype.getLength = function(){
 59     var len = 0;
 60     var tmp = this.head.next;
 61     while(tmp){
 62         len++;
 63         tmp = tmp.next;
 64     }
 65     return len;
 66 };
 67 DblLinkListAdt.prototype.getElem = function(i){
 68     if((i < 1) || (i > this.getLength())){
 69         return false;
 70     }
 71     var pos = 0;
 72     var tmp = this.head;
 73     while(true){
 74         if(pos == i){
 75             break;
 76         }
 77         pos++;
 78         tmp = tmp.next;
 79     }
 80     return tmp;
 81 };
 82 DblLinkListAdt.prototype.empty = function(){
 83     return this.head.next ? false : true;
 84 };
 85 DblLinkListAdt.prototype.clear = function(){
 86     this.head.next = null;
 87 };
 88 DblLinkListAdt.prototype.locate = function(data){
 89     if(this.empty()){
 90         return -1;
 91     }
 92     var node1 = this.head.next;
 93     var i = 1;
 94     var pos = -1;
 95     while(node1){
 96         if(node1.data == data){
 97             pos = i;
 98             break;
 99         }
100         node1 = node1.next;
101         i++;
102     }
103     return pos;
104 };
105 DblLinkListAdt.prototype.print = function(){
106     var aTmp = [];
107     var tmp = this.head.next;
108     while(tmp){
109         aTmp.push(tmp.data);
110         tmp = tmp.next;
111     }
112     console.log(aTmp.join(‘,‘));
113 };
114 DblLinkListAdt.prototype.padding = function(len){
115     for(i = 0; i < len; i++){
116         this.insert(i+1,this.node(i+1));
117     }
118     return true;
119 };

后记

数据结构基础线性表基本上学完了,后面还需要再接再励,学习更复杂的数据结构。

时间: 2024-12-24 16:53:54

数据结构学习系列之线性表(五)的相关文章

数据结构学习系列之线性表(三)

前言数据结构学习,发现坚持下来比较难,本次学习与上次学习间隔了几个月,不管怎样还是要强迫自己坚持下来. 静态链表 用数组模拟链式结构的线性表,对于没有指针的编程语言,只能使用这种方式来模拟.这是大师们想出来的实现方法,体会大师们的编程思路,站在大师们的肩膀上解决一个又一个的难题.每个节点包含一个游标(数组数字索引),用于指向下个节点,所以静态链表也称为游标链表.规定数组第一个元素为备用链表(未被使用的数组游标,静态链表初始化时,会生成备用链表)的头节点,数组最后一个元素为链表的头节点.当需要插入

数据结构学习系列之线性表(二)

前言 线性表链式存储结构的实现,通过这种方式实现的线性表,简称为链表,这是这篇文章的主题.与顺序存储相对应的是链式存储.链式存储逻辑结构相邻,物理结构可能相邻也有可能不相邻.链式结构的优点有:1.存储空间不限制(操作系统可支持的存储空间范围内):2.插入删除操作不需要移动元素等等.当然链式结构也有缺点,比如每个节点需要维护指向下一个节点的指针:比如需要查找某个节点时,需要从头节点开始查找,时间复杂度O(n)等等.总之,顺序存储以及链式存储各有优缺点,需要根据需求具体情况,选择合适的存储方式.没有

数据结构学习系列之线性表(四)

前言 使用没有指针的语言模拟实现数据结构,会碰到一些莫名奇妙的问题 单向循环链表 之前学习的链表都是单向且最后一个节点指向空节点,如果最后一个节点指向头节点,这样就形成了一个环,名字叫单向循环列表,简称循环列表 源码(JS模拟实现) 包含了头指针以及尾指针的实现 /** * @desc 循环链表 * * @author WadeYu * @date 2015-08-15 * @copyright by WadeYu */ var Node = function(data){ this.data

数据结构学习总结(2) 线性表之单链表

一,回忆链表 链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据.与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的. 例如,使用链表存储 {1,2,3},数据的物理存储状态如图 1 所示: 图 1 链表随机存储数据 我们看到,图 1 根本无法体现出各数据之间的逻辑关系.对此,链表的解决方案是,每个数据元素在存储时都配备一个指针,用于指向自己的直接后继元素.如图 2 所示: 图 2 各数据元素配备指针 像图 2 这样

C++数据结构与算法_1_线性表 --顺序表的实现与分析

顺序表的实现与分析 引 --线性表的抽象基类: template <typename T> class LinearList { public: LinearList(); ~LinearList(); virtual int Size() const = 0; //返回线性表所能够存储的最大长度 virtual int Length() const = 0; //当前线性表的长度 virtual int Search(T &x) const = 0; virtual int Loca

2、蛤蟆的数据结构笔记之二线性表

2.蛤蟆的数据结构笔记之二线性表 到了笔记二了,每个笔记开头都应该弄个语句激励一下自己和小伙伴. "人生中最重要的不是位置,而是前进的方向" 这次咱们学习表,没错是表.什么表?额,汉字真是博大精深,没错,只是个表.不要想歪了. 欢迎转载,转载请标明出处: 1.  定义 线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.因此,线性表

C++数据结构与算法_2_线性表 --顺序表的应用示例

h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-bottom: 0.21cm; }h1.western { fon

javascript实现数据结构: 稀疏矩阵之三元组线性表表示

稀疏矩阵(Sparse Matrix):对于稀疏矩阵,目前还没有一个确切的定义.设矩阵A是一个n*m的矩阵中有s个非零元素,设  δ=s/(n*m),称δ为稀疏因子, 如果某一矩阵的稀疏因子δ满足δ≦0.05时称为稀疏矩阵, 稀疏矩阵的压缩存储 对于稀疏矩阵,采用压缩存储方法时,只存储非0元素.必须存储非0元素的行下标值.列下标值.元素值.因此,一个三元组(i, j, aij)唯一确定稀疏矩阵的一个非零元素. 上图的稀疏矩阵A的三元组线性表为: ( (1,2,12), (1,3,9), (3,1

数据结构(二)——线性表简介

数据结构(二)--线性表简介 一.线性表简介 1.线性表简介 线性表是具有相同类型的n个数据元素的有限序列A0,A1,A2,...,An-1.Ai是表项,n是表的长度. 2.线性表的表现形式 线性表的表现形式:A.零个或多个数据元素组成的集合B.数据元素在位置上是有序排列的C.数据元素的个数是有限的D.数据元素的类型必须相同 3.线性表的性质 线性表的性质:A.A0为线性表的第一个元素,只有一个后继B.An-1为线性表的最后一个元素,只有一个前驱C.除A0与An-1外的其它元素既有前驱又有后继D