数据结构学习系列之线性表(五)
2015-10-25 14:45
281 查看
前言
单向链表查找下一个元素很方便,要查找上一个元素时,需要从头开始向下遍历,很是麻烦。如何解决这个问题呢?使用双向链表结构可以解决这个问题。
双向链表
在单向链表的基础上,增加一个指向上一个节点的指针,这就形成了双向链表结构。因增加了一个指针域,故需要占用更多的内存空间,换就话说,用空间换时间。现在硬件越来越强,而价格越来越低,这种思想的应用案例越来越普遍。
代码实现
后记
数据结构基础线性表基本上学完了,后面还需要再接再励,学习更复杂的数据结构。
单向链表查找下一个元素很方便,要查找上一个元素时,需要从头开始向下遍历,很是麻烦。如何解决这个问题呢?使用双向链表结构可以解决这个问题。
双向链表
在单向链表的基础上,增加一个指向上一个节点的指针,这就形成了双向链表结构。因增加了一个指针域,故需要占用更多的内存空间,换就话说,用空间换时间。现在硬件越来越强,而价格越来越低,这种思想的应用案例越来越普遍。
代码实现
/** * @desc 双向链表 * * @date 2015/08/23 * @copyright by WadeYu */ var DblLinkListAdt = function(){ this.head = this.node(0); this.init(); }; DblLinkListAdt.prototype.node = function(data){ return { data:data, prev:null, next:null }; }; DblLinkListAdt.prototype.init = function(){ return true; }; DblLinkListAdt.prototype.insert = function(i,node){ i = i -1; if( (i < 0) || (i > this.getLength())){ return false; } var pos = 0; var node1 = this.head,tmp; while(true){ if(pos == i){//找到第i-1个节点 break; } node1 = node1.next; pos++; } node.prev = node1; node.next = node1.next; node1.next.prev = node; node1.next = node; return true; }; DblLinkListAdt.prototype.delete = function(i){ if((i < 1) || (i > this.getLength())){ return false; } var pos = 1; var node1 = this.head; while(true){ if(pos == (i-1)){ break; } node1 = node1.next; } var node2 = node1.next; node2.next.prev = node1; node1.prev = node2.next; return true; }; DblLinkListAdt.prototype.getLength = function(){ var len = 0; var tmp = this.head.next; while(tmp){ len++; tmp = tmp.next; } return len; }; DblLinkListAdt.prototype.getElem = function(i){ if((i < 1) || (i > this.getLength())){ return false; } var pos = 0; var tmp = this.head; while(true){ if(pos == i){ break; } pos++; tmp = tmp.next; } return tmp; }; DblLinkListAdt.prototype.empty = function(){ return this.head.next ? false : true; }; DblLinkListAdt.prototype.clear = function(){ this.head.next = null; }; DblLinkListAdt.prototype.locate = function(data){ if(this.empty()){ return -1; } var node1 = this.head.next; var i = 1; var pos = -1; while(node1){ if(node1.data == data){ pos = i; break; } node1 = node1.next; i++; } return pos; }; DblLinkListAdt.prototype.print = function(){ var aTmp = []; var tmp = this.head.next; while(tmp){ aTmp.push(tmp.data); tmp = tmp.next; } console.log(aTmp.join(',')); }; DblLinkListAdt.prototype.padding = function(len){ for(i = 0; i < len; i++){ this.insert(i+1,this.node(i+1)); } return true; };
后记
数据结构基础线性表基本上学完了,后面还需要再接再励,学习更复杂的数据结构。
相关文章推荐
- 数据结构实践项目——树和二叉树
- MySQL索引背后的数据结构及算法原理
- 数据结构实践项目——树和二叉树(1)
- 常见排序算法小结
- 判断图的连通分量
- 图的连通性判断
- Java 笔试:数据结构笔记
- STL中提供-二分查找算法
- 学习笔记之数据结构与算法(二)
- 内存管理器(七)Glibc malloc 实现(三)--多线程思想(先占个坑)
- JavaScript描述数据结构与算法——列表
- R语言的数据类型和数据结构
- 引用 Map 数据结构的排序问题
- Java 的 ArrayList 的底层数据结构
- JSON数据结构学习
- 数据结构之二叉树的线索化
- 线性表
- 程序员代码面试指南:IT名企算法与数据结构题目最优解-字符串问题:C/C++语言实现
- 数据结构—队列
- AVL树