您的位置:首页 > 理论基础 > 数据结构算法

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

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;
};


后记

数据结构基础线性表基本上学完了,后面还需要再接再励,学习更复杂的数据结构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: