链表JavaScript

本文章是自学,也是在csdn上学习的,有借鉴其他博主。

目录

一.什么是链表

二.链表演示

1.单向链表:

2.双向链表

三.链表的优缺点

四.简单示例

append

insert

get

一.什么是链表

链表(Linked list)是一种常见的数据结构,它由一系列节点组成,每个节点包含两个部分:数据域和指针域。数据域用于存储元素值,指针域用于指向链表中下一个节点。链表中的节点是动态分配的,可以根据需要随时插入或删除。

链表的特点是:

  1. 动态分配内存,可以根据需要随时插入或删除节点。
  2. 节点之间通过指针相互链接,可以高效地进行遍历操作。
  3. 链表不支持随机访问,需要从头节点开始逐个遍历。
  4. 链表在插入和删除节点时,需要进行指针调整操作。

链表的应用非常广泛,例如在排序、查找、动态内存分配等方面都有应用。

二.链表演示

1.单向链表:

1.header指向链表的第一个值

2.链表最后一个指向空null

3.当链表为空时,header指向null

4.链表为(数据域+指针域)

2.双向链表

三.链表的优缺点

链表是一种常见的数据结构,它具有以下优势:

  1. 动态内存管理:链表中的元素在内存中不必是连续的空间,可以充分利用计算机的内存,实现灵活的内存动态管理。
  2. 插入和删除操作方便:链表在插入和删除数据时,时间复杂度可以达到O(1),相对数组效率高很多。链表的节点之间是通过指针相互链接的,可以高效地进行遍历操作。
  3. 节省空间:链表不需要像数组一样预先分配一定的内存空间,可以根据需要随时插入或删除节点,因此可以更充分地利用内存空间。

然而,链表也有一些缺点:

  1. 访问元素时需要从头节点开始逐个遍历:与数组不同,链表不支持随机访问,需要从头节点开始逐个遍历才能找到目标元素。
  2. 需要额外的空间存储指针:每个节点除了存储数据外,还需要存储指向下一个节点的指针,因此需要额外的空间来存储这些指针。
  3. 插入和删除节点时需要调整指针:在链表中插入或删除节点时,需要调整指针来更新节点之间的链接关系,这会增加代码的复杂度和运行时间。

总之,链表和数组各有其优缺点,应根据具体的应用场景选择合适的数据结构。

四.简单示例

单向链表:

单向链表的定义

append

// 单向链表
// 封装单向链表类
function LinkList() {
    // 封装一个内部类:节点类
    function Node(data) {
        this.data = data;
        this.next = null;
    }
    // 属性
    // 属性head指向链表的第一个节点
    this.head = null;
    this.length = 0;

    // 1.追加方法
    LinkList.prototype.append = function (data) {
        // 1.创建新的节点
        var newNode = new Node(data)

        // 2.判断是否添加的是第一个节点
        if (this.length === 0) {  //2.1 是第一个节点
            // 将head指向newNode
            this.head = newNode
        } else {
            // 先设置一个变量指向当前链表的最后一个节点
            var current = this.head
            while (current.next) {//当不是最后一个节点,则不断向下指下去
                current = current.next
            }

            // 最后节点的next指向新的节点
            current.next = newNode
        }

        // 3.长度加1
        this.length += 1
    }
}
let list = new LinkList()
list.append("a")
list.append("b")
list.append("c")
console.log(list);

insert

//insert方法
    LinkList.prototype.insert = function(position,data){
        // 如果插入位置小于0或大于数值长度,就插入错误
        if(position<0 || position>this.length){
            return false
        }
        let newNode = new Node(data)

        // 如果插入位置为0
        if(position == 0){
            newNode.next = this.head
            this.head = newNode
        }else{
            let index = 0
            let previous = null
            let current = this.head
            while(index++ < position){
                previous = current
                current = current.next
            }
            newNode.next = current
            previous.next = newNode
        }
        this.length+=1
        return true

    }

get

LinkList.prototype.get = (position)=>{
        if(position<0 || position>this.length){
            return false
        }
        let current = this.head
        let index = 0
        while(index++<position){
            current = current.next
        }
        return current.data
    }

更详细的请移步:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值