目录
一、链表
链表的优势:
链表中的内容不必是连续的空间
链表的每个元素都由一个存储元素本身的节点和一个指向下一个元素的引用组成
在插入和删除数据时,事件复杂度可以达到O(1)
链表的缺点:
访问元素需要从头访问
封装:LinkedList类
内部有一个Node类,用于封装每一个节点上的信息
保存两个属性,一个是链表的长度,一个是链表中的第一个节点
常见操作:
append(el) 向列表尾部添加一个新的项
insert(position,el) 向列表的特定位置插入一个新的项
get(position) 获取对应位置的元素
indexOf(el) 返回元素在列表中的索引
update(position,el) 修改某个位置的元素
removeAt(position) 从列表的特定位置删除一项
remove(el) 从列表中移出一项
isEmpty() 链表是否为空
size() 链表中元素的个数
toString() 只输出元素的值
二、双向链表
单向的弊端:只能从头遍历,过程是单向的,寻找上一个节点很困难
特点:head指针指向着节点,tail指针指向尾部节点
每个节点由三部分组成:prev、data、next
第一个节点的prev指向null
最后一个节点的next指向null
缺点:插入及删除节点要复杂一些
封装:DoublyLinkedList :head tail length
常见操作:
append(el) 向列表尾部添加一个新的项
insert(position,el) 向指定位置添加一个项
get(position) 获取对应位置的元素
indexOf(el) 返回元素在列表中的索引
update(position,el) 修改某个位置的元素
removeAt(position) 从列表的特定位置删除一项
remove(el) 从列表中移出一项
isEmpty() 链表是否为空
size() 链表中元素的个数
toString() 只输出元素的值
forwardString() 返回正向遍历的节点字符串
backwardString() 返回反向遍历的节点字符串
三、集合set
常见操作:
add(value) 添加一个项,返回一个布尔值
remove(value) 删除一个项
has(value) 是否包含某个项
clear() 清空集合
size() 集合中元素的个数
values() 返回一个包含集合中所有元素的数组
集合间的操作:
1.并集
union(other){
// this other
let arr=this.values().concat(other.values(other))
let newMS=new MySet()
arr.forEach(value=>{
newMS.add(value)
})
return newMS
}
2. 交集
insertSection(other){
// this other
// 从this中拿到每一个元素判断other中是否包含
let newMS=new MySet()
let arr=this.values()
arr.forEach(value=>{
if(other.has(value)){
newMS.add(value)
}
})
return newMS
}
3.差集
difference(other){
// this other
let newMS=new MySet()
let arr=this.values()
arr.forEach(value=>{
if(!other.has(value)){
newMS.add(value)
}
})
return newMS
}
4.子集
isSubSet(other){
// this是否是other的子集
let arr=this.values()
let is=true
arr.forEach(value=>{
if(!other.has(value)){
is= false
}
})
return is
}