最近复习了一些数据结构,正好看到一套结合前端的数据结构学习视频,学完感觉领悟了不少。打算记录记录,内容比较多,每天记录一些,当作二次复习。主要有一下数据结构:
- 链表
- 栈和队列
- 集合和字典
- 散列表
- 树
- 图
链表
线性表主要有顺序表和链表,这里主要说说链表。链表需要定义一个head来记录链表,每个链表上的节点node,都有一个element和next,element记录自身的内容,next记录了该节点的下一个节点。
链表实现的方法:append(element) 在尾部添加元素、insert(pos, element) 在指定位置插入元素、indexOf() 获取元素在链表中的位置、removeAt(pos)根据位置的删除对应的元素、remove(elemnet)根据位置的删除对应的元素、getHead() 获取链表
var LinkedList = function(){
var head = null; //初始化为null
var Node = function(element){
this.value = value;
this.next = null; //next初始化为null
}
//在尾部添加元素
this.append = function(element){
var node = new Node(element)
if(head == null){ //若栈空,直接head = element
head = node;
}
else{ //若栈不空,找到到栈最后一项插入元素
var current = head;
while(current.next){
current = current.next;
}
current.next = node;
}
length++; //每添加一个元素,长度+1
}
//在pos位置上插入节点element
this.insert = function(pos,element){
//考虑越界,pos不能小于0,也不能大于链表长度
if(pos > -1 && pos < length){
var node = new Node(element);
var current = head;
if(pos == 0){ //位置为0,相当于在链表头插入节点
head = node;
node.next = current;
}
else{
var previous = null;
var index = 0;
while(index < pos){ //一直到pos这个位置跳出循环
previous = current; //记录前一个节点
current = current.next;
index++;
}
node.next = current;
previous.next = node;
}
length ++; //插入一个节点,链表长度+1
}
}
//获取节点在链表中的位置
this.indexOf = function(element){
var index = 0;
var current = head;
while(current){
if(current.element == element){ //如果找到当前元素,跳出循环
return index;
}
current = current.next;
index ++;
}
return -1; //找不到返回-1
}
//根据位置删除节点
this.removeAt = function(pos){
//考虑越界,pos不能小于0,也不能大于链表长度
if(pos > -1 && pos < length){
var current = head;
if(pos == 0){ //位置为0,相当于删除链表头的节点
head = current.next;
}
else{
var previous = null; //记录前一个节点
var index = 0;
while(index < pos){ //一直到pos这个位置跳出循环
previous = current;
current = current.next;
index++;
}
previous.next = current.next; //将当前位置的前一个节点的next,直接置成当前位置的下一个节点的值,相当于删除当前位置的节点
}
length--; //删除一个节点,链表长度-1
return current;
}
return -1; //找不到返回-1
}
//根据元素删除节点
this.remove = function(element){
return this.removeAt(this.indexOf(element))
}
//获取链表长度
this.size = function(){
return length;
}
//判断链表是否为空
this.isEmpty = function(){
return length == 0;
}
//将链表置为空
this.clear = function(){
length = 0;
head = null;
}
//获取链表
this.getHead = function(){
return head;
}
}