博客
关于我
线性数据结构
阅读量:676 次
发布时间:2019-03-17

本文共 1480 字,大约阅读时间需要 4 分钟。

线性数据结构之数组与链表

在线性数据结构中,数组链表是最常见的两种类型,它们在数据存储和操作上各有优劣之处。

数组

数组的核心特点是固定长度,存储空间必须是连续的,这使得数组在内存中占用较为紧凑。然而,数组的长度无法随意更改,这也是数组性能优越的原因之一。

延伸思考:为什么数组不能直接向后扩容?这是因为操作系统分配内存时通常会分配一个较大的连续块,当数组长度不足时,系统需要通过重新分配一个更大的存储空间,并将原数组数据复制到新位置。这种操作虽然效率不高,但由于被优化了,作为开发者,我们不需要手动管理数组长度。

数组的优点

  • 查询速度快:由于数组存储是基于偏移地址访问的,直接通过a[x]可以快速访问特定位置的元素。
  • 内存紧凑:数组的存储空间是连续的,减少了碎片问题。
  • 数组的缺点

  • 内存碎片:当数组较大时,系统可能出现内存碎片,影响新存储空间的获取。
  • 长度不灵活:数组的长度固定,难以进行添加或删除操作。
  • 链表

    与数组不同,链表以动态链接的方式存储数据,其节点通常包含数据值和指向下一个节点的引用。链表的关键特点是柔性,高度灵活。

    链表的特点

  • 空间利用低效:每个节点都需要额外存储一个引用指向下一个节点。
  • 查询速度慢:要访问链表中的某个节点需要逐步遍历到该节点,时间复杂度为O(n)。
  • 链表的优点

  • 灵活性高:支持高效添加和删除操作。
  • 内存利用高效:链表可以扩展到需要的大小,无需担心内存碎片。
  • 链表的缺点

  • 查询效率低:需要从头节点开始逐步访问,导致查找某个节点时间较长。
  • 内存浪费:每个额外节点需要额外的存储空间,增加了内存占用。
  • 链表的使用场景

    链表特别适合需要频繁插入、删除操作且数据规模不大或无法预先确定大小的场景。

    链表操作示例

    // 创建链表节点function Node(value) {    this.value = value;    this.next = null;}// 例子:var a = new Node(1);var b = new Node(2);var c = new Node(3);var d = new Node(4);a.next = b;b.next = c;c.next = d;// 遍历链表function loopLink(root) {    var temp = root;    while (temp != null) {        console.log(temp.value);        temp = temp.next;    }}// 递归遍历function loopLink1(root) {    if (root == null) {        return;    }    console.log(root.value);    loopLink1(root.next);}// 链表逆置function nizhi(root) {    if (root.next == null) {        return root;    }    var lastNode = nizhi(root.next);    root.next = null;    // 上结点的前一个指向当前上结点的前一个    if (root.next != null) {        root.lastNode = root;    }    return lastNode;}

    链表在实际应用中的表现取决于具体需求,两者各有优劣,选择时需要综合考虑数据规模和操作频率。

    转载地址:http://hzjhz.baihongyu.com/

    你可能感兴趣的文章
    UML-配置图
    查看>>
    JS高级面向对象(二)-构造函数和原型
    查看>>
    python入门到秃顶(10):异常
    查看>>
    ES6_变量生明
    查看>>
    考研复试英语问答
    查看>>
    百度背景换肤案例
    查看>>
    修改ng-zorro中table对齐及宽度等细节
    查看>>
    输出对象的值——踩坑
    查看>>
    angular2项目里使用排他思想
    查看>>
    折线图上放面积并隐藏XY轴的线
    查看>>
    zabbix之自动发现
    查看>>
    Experience of tecent interview
    查看>>
    failed to push some refs to git
    查看>>
    在苹果Mac上如何更改AirDrop名称?
    查看>>
    1110 Complete Binary Tree (25 point(s))
    查看>>
    541【毕设课设】基于单片机电阻电感电容RLC测量仪系统
    查看>>
    568【毕设课设】基于单片机多路温度采集显示报警控制系统设计
    查看>>
    基于8086交通灯系统仿真设计(微机原理设计资料)
    查看>>
    解读域名管理之:域名注册机构介绍
    查看>>
    找中位数
    查看>>