数据结构之链表及js实现(插入、删除、查找、显示)
链表
由一组不必相连的内存结构,按特定的顺序链接在一起的抽象数据类型
单链表
1. 基本结构
- Data + Next指针
- 链尾的Next指针指向空(Next = Null)
- 遍历方向单一(只能从头到尾)
2. 插入操作

3. 删除操作

双向链表
1. 基本结构
- Data + Next(后继) + Prev(前驱)
- 链头没有前驱 Prev = Null
- 链尾没有后继 Next = Null
- 双向遍历
2. 插入操作

3. 删除操作

循环链表
1. 基本结构
单向循环链表

单链表基础上,链尾Next指向链头形成闭环
双向循环链表

双向链表基础上,链尾Next指向链头,链头Prev指向链尾
2. 插入操作
单向循环链表的插入

双向循环链表的插入

3. 删除操作
单向循环链表的删除

双向循环链表的删除

单链表的js实现
// Node类表示节点
function Node(element){
this.element = element; //当前节点的元素
this.next = null; //next属性初始化为空,有新元素插入时更新
}
//LList类提供插入,删除操作
function LList(){
this.head = new Node('head');
this.find = find;
this.insert = insert;
this.display = display;
this.findPrev = findPrev;
this.remove = remove;
}
//查找 find
function find(item){
var curNode = this.head; //创建新节点,将链表头节点赋给它
while(curNode.element != item){
curNode = curNode.next; //当前节点element属性和要找的不符,当前节点移动到下一个
}
return curNode; //查找成功,返回该数据的节点
}
//插入操作 insert
function insert(newElement,item){
var newNode = new Node(newElement); //创建新的节点
var curNode = this.find(item); //找到节点,可以开始插入
newNode.next = curNode.next; //新节点的next = 后面节点next对应的值
curNode.next = newNode; //后面节点next指向新节点
}
//显示链表元素 display
function display(){
var curNode = this.head; //创建新节点,将链表头节点赋给它
while(!(curNode.next ==null)){ //当前节点不是链尾
console.log(curNode.next.element); //打印当前节点next
curNode = curNode.next; //当前节点指向下一个
}
}
//实例测试display: Apple->Banana->Pear
var fruits = new LList();
fruits.insert('Apple','head');
fruits.insert('Banana', 'Apple');
fruits.insert('Pear','Banana');
console.log(fruits.display());
//查找待删除节点的前一个节点 findPrev
//方法:遍历链表,检查每个节点的下一个节点是否存储待删除的数据,找到则返回
function findPrev(item){
var curNode = this.head;
while (!(curNode.next == null)&&(curNode.next.element !=item)){
//当前节点不是链尾&&当前节点的下一个节点是需要删除的节点
curNode = curNode.next;
}
return curNode;
}
//删除 remove
function remove(item){
var prevNode = this.findPrev(item); //找到待删除节点的前一个节点
if (!(prevNode.next == null)){ //如果前一个节点
prevNode.next = prevNode.next.next; //让前一个节点不再指向待删除节点,而是待删除节点后面一个节点
}
}
//实例测试remove
fruits.insert('Grape','Pear');
console.log(fruits.display()); //A->B->P->G
fruits.remove('Banana'); //Remove掉香蕉
console.log(fruits.display()); //A->P->G
参考资料: https://www.jianshu.com/p/73d56c3d228c
281

被折叠的 条评论
为什么被折叠?



