首页 > 其他分享 >链表与数组的区别

链表与数组的区别

时间:2022-12-18 16:55:38浏览次数:66  
标签:存储 线性表 区别 元素 链表 数组 结构

原文链接:https://baijiahao.baidu.com/s?id=1743478279629141019

物理存储结构不同

链表与数组在计算机中存储元素采用不同的物理存储结构,数组是顺序存储结构,链表是链式存储结构。

实际上数组和链表都属于线性表,线性表在计算机内可以采用不同的存储方式,采用顺序存储结构时称为为数组,采用链式存储结构时称为为链表。

线性表是一种最常用且最简单的数据结构,它是由零个或多个数据元素构成的有限序列。

线性表元素之间的逻辑关系是相邻关系,在长度为n的线性表中,第i-1个元素领先于第i个元素,第i个元素领先于第i+1个元素,第i-1个元素为第i个元素的直接前驱元素,第i+1个元素为第i个元素的直接后驱(如下图所示)。

 

 

         线性表逻辑结构

因此链表与数组的逻辑结构是相同的,都是零个或多个数据元素构成的线性表。在计算内存储线性表有两种方式:一种是顺序存储结构;一种是链式存储结构。采用顺序存储结构的线性表也称为数组,采用链式存储结构的线性表也称为链表。

数组的存储结构

数组用一组地址连续的存储单元来存储表中的元素,这种结构称为顺序存储结构,它以元素在计算机内物理位置上的紧邻来表示线性表中数据元素之间相邻的逻辑关系,如下图所示。

 

 

数组的顺序存储结构

 

上图给出了数组的存储结构,数组采用一组连续的存储单元来存储数组内的元素,数组逻辑上相邻的元素在物理存储上也相邻。第i个元素的存储位置和数组的起始位置相差一个和元素在数组中的序号成正比的常数,根据元素在数组中的序号和数组的起始位置,就可以定位一个数组元素的存储位置,因此数组也是一个随机存取的结构。

链表的存储结构

链式存储结构不要求逻辑上相邻的两个元素在物理位置上也相邻,链表元素除了存储元素本身的数据外,还需要存储一个指向下一个元素的位置数据,程序可以通过该信息访问到下一个元素。元素数据和位置数据构成了链表数据元素的存储映像,该存储映像也称为链表的节点。节点包括两个存储域:一个存储域存储元素本身的数据,称为数据域;一个存储域存储链表中下一个元素的位置数据,称为指针域。n个节点构成一个链表,当节点只包含一个指针域时,称为单链表。如下图所示。

 

 链表节点数据结构

单链表

上图给出了单链表结构,整个链表的存取必须从头指针开始,头指针指示链表中第一个节点的存储位置。由于最后一个数据元素没有直接后继,因此线性单链表中最后一个节点的指针为空(NULL)。

内存分配方式不同

数组的存储空间一般采用静态分配,在分配之前需要确定数组的大小,按照数组的大小分配内存,内存申请单位为数组内所有元素占用的空间,数组的长度一般不宜动态扩展,申请的内存区域一般在栈区;链表的存储空间一般采用动态分配,内存申请单位一般为一个链表节点的空间,链表的长度可以动态扩展,申请的内存区域一般在堆区。

元素的存取方式不同

数组是顺序存储结构,数组元素可以直接通过元素的下标(索引)进行直接存取,时间复杂度为O(1);

链表是链式存储结构,链表在进行元素存取时,需要遍历链表,时间复杂度为O(n),n为链表的长度。

元素的插入和删除方式不同

数组在进行元素插入和删除时,需要移动数组内的元素,以保持数组元素排列的顺序性,时间复杂度为O(n);

链表在进行元素插入和删除时无需移动链表内的元素,但由于链表不是顺序存储结构,为寻找第i个元素,仍然需要遍历链表,因此时间复杂度为O(n)。

 

标签:存储,线性表,区别,元素,链表,数组,结构
From: https://www.cnblogs.com/zhu4c4/p/16990551.html

相关文章

  • 稀疏数组
    分析问题因为二维数组的很多默认值是0,因此记录了很多没有意义的数据解决:稀疏数组(记录有效的坐标)稀疏数组介绍1使用条件:当一个数组中大部分元素为0,或者为同一值的数组......
  • 链表--删除无序链表中重复的节点
    题目:给定一个无顺序单链表的头节点head,删除其中值重复的元素思路:利用哈希表。生成一个哈希表,因为头节点是没有必要去删除的节点,所以首先将头节点放入哈希表;从头......
  • Linux 命令 su 和 sudo 的区别
    前戏参加某大会和某个运维行业大佬聊天被问到一直没有研究过这个问题,可能一直是最高权限吧sudosudo是一种权限管理机制,依赖于/etc/sudoers,其定义了授权给哪个用户可以以管......
  • 简单认识指针数组与数组指针
    指针数组:指针数组就是一个存放指针的数组。//指针数组#include<stdio.h>intmain(){inta[5]={1,2,3,4,5};intb[]={2,3,4,5,6};intc[]=......
  • 【LeeCode】4. 寻找两个正序数组的中位数
    【题目描述】给定两个大小分别为 ​​m​​​ 和 ​​n​​​ 的正序(从小到大)数组 ​​nums1​​​ 和 ​​nums2​​。请你找出并返回这两个正序数组的 中位数 。......
  • 1764. 通过连接另一个数组的子数组得到一个数组
    1764.通过连接另一个数组的子数组得到一个数组题解:数据范围小,直接暴力双指针publicbooleancanChoose(int[][]groups,int[]nums){intn=groups.le......
  • 「双指针/kmp」通过连接另一个数组的子数组得到一个数组(力扣第1764题)
    本题为12月17日力扣每日一题题目来源:力扣第1764题题目tag:双指针kmp题面题目描述给你一个长度为n的二维整数数组groups,同时给你一个整数数组nums。你是否可以从n......
  • #include <> 和 #include "" 的区别
    include<>和#include""的区别1.#include<>引用的头文件应当是编译器中的类库目录下的头文件。2.#include""引用的头文件是程序目录下的头文件。3.如果#include......
  • redis底层数据结构之双向链表(linkedlist)
    双向链表(linkedlist)redis的双向链表(linkedlist)是基于链表的一种数据结构链表是一种常见的基础数据结构,是一种非顺序存储数据的线性表,在每一个节点里存储了下一个节点......
  • 链表经典问题
    链表经典问题1.反转链表问题:将链表反转,并返回新的头节点。思路:设置两个指针,反别表示现节点和前节点,遍历链表,同时设置一个临时指针储存下一个节点。然后让现指针的next指......