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

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

2015-01-25 09:33 399 查看

前言

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

链式结构

什么是链式结构呢?线性表各个节点逻辑结构相邻,物理结构可以不相邻,这样的存储方式是链式存储,每个节点的关联关系就是链式结构。

链表的抽象数据结构模型

它包含:节点的定义,链表初始化,插入,删除,清空,销毁,链表长度,是否为空的判断,查找,定位等操作。使用JS模拟实现链表抽象数据结构模型。不同的语言实现方式不一样。

初始化

头插法

LinkList.prototype.createHead = function(n){ //头插法
for (var i = 0 ; i < n; i++){
var node = new Node( Math.ceil(Math.random()*10000));
node.next = this.head.next;
this.head.next = node;
}
return true;
};


尾插法

LinkList.prototype.createTail = function(n){ //尾插法
var lastNode = this.head;
for (var i = 0; i < n; i++){
node = new Node( Math.ceil(Math.random()*10000));
lastNode.next = node;
lastNode = node;
}
return true;
};


插入

链表中元素插入第N个位置,找到链表中第N-1个位置的节点之后,让需要插入的节点后继节点指针指向第N-1个节点的后继节点,然后第N-1个节点的后继节点指针指向当前插入的节点

LinkList.prototype.insert = function(i,node){
i = parseInt(i);
if (isNaN(i)){
return false;
}
if (!(node instanceof Node)){
return false;
}
var j = 1;
var p = this.head;
while (p && (j < i)){
p = p.next;
j++;
}
if (!p || (j < i)){
return false;
}
node.next = p.next;
p.next = node;
return true;
}


删除

删除链表中第N个元素,找到第N-1个位置的节点,让第N-1个节点的后继指针指向第N个节点后继节点指针指向的后继节点,然后释放第N个节点的内存

LinkList.prototype.remove = function(i){
i = parseInt(i);
if (isNaN(i) || (i < 1)){
return false;
}
var p = this.head;
var j = 1;
while (p && (j < i)){
p = p.next;
j++;
}
if (!p || (j < i)){
return false;
}
var q = p.next;
if (!q){
return false;
}
p.next = q.next;
q.next = null;
return q;
};


查找

LinkList.prototype.get = function(i){
i = parseInt(i);
if (isNaN(i)){
return false;
}
var p = this.head;
var j = 1;
while(p && (j < i)){
p = p.next;
j++;
}
if (!p || (j < i)){
return false;
}
if (p.next){
return p.next.data;
}
return false;
};


定位

LinkList.prototype.locate = function(node){
if (!(node instanceof Node)){
return -1;
}
var p = this.head.next;
var j = 1;
while(p){
if (p.data == node.data){
return j;
}
j++;
p = p.next;
}
return -1;
};


清空

LinkList.prototype.clear = function(){
var p = this.head;
var q;
while(p){
q = p.next;
p = p.next;
delete q;
}
this.head.next = null;
return true;
};


完整代码

var linkList = new LinkList();
linkList.createTail(5);

console.log("The Link list is:");
linkList.print();

console.log("----------------------");

console.log("Test Insert");
for (var i = 0; i < 2; i++){
var iTmpData = Math.ceil(Math.random()*10000);
var iPos = Math.ceil(Math.random()*10);
console.log("Insert data %s at No.%s",iTmpData,iPos);
linkList.insert(iPos,new Node(iTmpData));
}
linkList.print();

console.log("--------------------------");

console.log("Test Remove");

for (var i = 0; i < 2; i++){
var iPos = Math.ceil(Math.random()*10);
console.log("Remove data at %s",iPos);
linkList.remove(iPos);
}
linkList.print();

console.log("-----------------------");

console.log("Test Get");

for (var i = 0; i < 5; i++){
var iPos = Math.ceil(Math.random()*10);
console.log("The Data At %s is %s",iPos,linkList.get(iPos));
}

console.log("-----------------------------");

console.log("Test Locate");

var aData = [];
var p = linkList.head.next;
while(p){
aData.push(p.data);
p = p.next;
}
for (var i = 0; i < 5; i++){
iTmpData = aData[ Math.ceil(Math.random()*10)  % aData.length];
console.log("The Data %s At %s",iTmpData,linkList.locate(new Node(iTmpData)));
}

console.log("----------------------");

console.log("Test Clear");

linkList.clear();
linkList.print();


View Code

后记

链表是最基本的数据结构,是其它数据结构的基础,需要好好掌握它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: