数据结构之链表及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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值