单链表

一、JavaScript数组与其他编程语言数组对比

  • 其他语言
    • 长度固定,当数组已经被数据填满之后,再无法加入其他元素,产生越界错误
    • 添加和删除元素麻烦,需要将数组中的其他元素向前或向后移动
  • JavaScript
    • 长度不固定
    • splice随意添加删除元素,无需移动其他元素

二、JavaScript数组缺点

  • 被实现成了对象,因此在实际上使用时会很慢。于是我们可以考虑用链表来代替。
  • 如果需要随机访问,数组仍然是最好的选择

三、链表概述

  • 链表由一组节点组成,每个节点都有一个指针(对象的引用)指向它的后继。这个指针叫做链。

这里写图片描述
- 数组元素靠他们的位置进行引用,链表元素是通过相互之间的关系进行引用
- 遍历链表,就是跟着这条链,从头走到尾
- 头结点常常用来作为链表的入口,尾结点要指向NULL

四、基于对象的链表设计
1、Node类:表示结点

function Node(ele){
    this.element = ele;
    this.next = null;
}

2、LinkedList类:对链表的操作

function LinkedList(){
    this.head = new Node("head");
    this.find = find;               //遍历链表,查找给定的元素
    this.insert = insert;           //插入节点
    this.remove = remove;           //删除节点
    this.display = display;         //遍历展示
    this.findPre = findPre;         //查找指定元素的前驱
}

3、查找节点

  • 遍历链表,查找给定的数据。如果找到数据,就返回保存该数据的节点。(实现插入删除的基础)
function find(item){
    var obj = this.head;
    while(obj.element != item && obj != null){
        obj = obj.next;
    }
    return obj;
}

代码解释

  • 创建一个新节点,指向当前链表的头结点
  • 遍历链表
  • 找到返回结点,没找到则为null;

4、插入节点

  • 向链表中插入一个节点,需要修改他的前面的节点使其指向新节点,新插入的节点则指向原来前前驱所指向的节点
  • 图解:在p元素之后插入

这里写图片描述

function insert(cur,item){
    function insert(cur,item){
    var item = new Node(item);
    var cur = this.find(cur);
    if(cur){
        item.next = cur.next;
        cur.next = item;
    }
}
}

3、删除节点

  • 将待删出节点的前驱指向待删除节点的后继
  • 将待删除节点指向NULL

这里写图片描述

  • 删除要先找到待删除元素的直接前驱:
function remove(item){
    var item = this.findPre(item);
    if(item.next.next != null){
        item.next = item.next.next;
    }
}

4、显示链表中的所有元素

function display(){
    var obj = this.head.next;
    while(obj != null ){
        console.log(obj.element);
        obj=obj.next;
    }
}

5、测试程序

var list = new LinkedList();
list.insert("head","monkey");
list.insert("monkey","cat");
list.insert("cat","mall");
list.display();
list.remove("cat");
list.display()

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值