数据结构学习系列之线性表(二)
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
后记
链表是最基本的数据结构,是其它数据结构的基础,需要好好掌握它。相关文章推荐
- 数据结构学习系列之线性表(三)
- 数据结构学习系列之线性表(五)
- 数据结构学习系列之线性表(一)
- 数据结构学习系列之线性表(四)
- 数据结构入门学习系列-3(线性表的顺序存储)
- C#数据结构和算法学习系列十三----链表
- C#数据结构和算法学习系列十四----集合
- C#数据结构和算法学习系列四----基础排序算法
- C#数据结构和算法学习系列五----基础查找算法
- 数据结构学习系列六-链式栈(c++实现且应用模板)
- 学习数据结构 -> 线性表 -> 线性表的介绍
- C#数据结构和算法学习系列十二----散列HashTable类
- 数据结构学习系列五-顺序栈(c++实现且应用模板)
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 数据结构学习笔记 --- 线性表 (一元多项式的表示及相加)
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 数据结构学习笔记 --- 线性表 (顺序表)
- C#数据结构和算法学习系列三----ArrayList类的特性及应用
- 数据结构学习系列四-顺序栈(c语言实现)
- C#数据结构和算法学习系列七----队列、队列的实现和应用