线性结构和链表的区别
数组
- 需要连续的空间,不满足的时候需要扩容,消耗内存和性能
- 插入的成本比较高
- 访问的成本低
链表
- 不需要连续的空间
- 插入和删除的时候,时间复杂度为O(1)
- 访问的时间复杂度为O(n)
- 每个节点有一个数据和下一个节点的指针
链表的封装
初始化
//链表的初始化操作
this.head=null;
this.length=0;
function Node(data){
this.data=data;
this.next=null;
链表添加元素
//链表的添加操作
Linkedlist.prototype.append=function(data){
var newNode=new Node(data)
if(this.head==null){
this.head=newNode;
}else{
var current=this.head;
while(current.next){
current=current.next;
}
current.next=newNode;
}
this.length+=1;
}
双向链表
- 相比于单向链表,内存更大,每个节点保存数据,前面指针和后面的指针
- 有利于双向遍历,相比单向链表只能指向下一个比较好
集合
特点
- 集合比较常见的实现是哈希表
- 集合通常是一组无序的,不能重复的元素构成
知识储备
var obj={'zxx':'xx','zz':'44','ddd':111}
console.log(Object.keys(obj));
//['zxx','zz','ddd']
//获取到所有key的属性,以属性形式返回
this.items.hasOwnProperty(value)
//检查对象是否有属性值
如果return 为false那么后面的this.items也不会执行了
Set.prototype.add=function(value){
if(this.items.hasOwnProperty(value)){
return false
}
this.items[value]=value
return true
}
封装
function Set(){
//用对象,可以实现不重复的性质
this.items={}
//方法
Set.prototype.add=function(value){
if(this.items.hasOwnProperty(value)){
return false
}
this.items[value]=value
return true
}
Set.prototype.has=function(value){
return this.items.hasOwnProperty(value)
}
Set.prototype.remove=function(value){
if(!this.items.hasOwnProperty(value)){
return false
}
//删除是这样的
delete this.items[value]
}
Set.prototype.clear=function(){
this.items={}
}
Set.prototype.size=function(){
return Object.keys(this.items).length
}
Set.prototype.values=function(){
return Object.keys(this.items)
}
}
字典
特点
- 和集合很像
- key是不可以重复,value可以重复,key是无序的
- 字典的key可以是对象