数据结构:线性表(上)

news2024/9/22 5:33:48

谈到线性的数据结构,那肯定离不开两个最基础的:数组和链表,当然有了数组和链表就会聊到栈和队列。

那么本篇我们就来介绍数组和链表

一、数组

数组(Array) 是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。

我们直接可以利用元素的索引(index)可以计算出该元素对应的存储地址。

数组的特点是:提供随机访问 并且容量有限。

假如数组的长度为 n。
访问:O(1)//访问特定位置的元素
插入:O(n )//最坏的情况发生在插入发生在数组的首部并需要移动所有元素时
删除:O(n)//最坏的情况发生在删除数组的开头发生并需要移动第一元素后面所有的元素时
  • 随机访问能力:可以以o(1)时间复杂度,以下标访问某一元素

  • 物理上连续,逻辑上连续,所以数组有下标

  • 数组一旦初始化,长度不能被修改

  • 当需要扩容时,需要创建新数组,将老数组的内容复制过来

  • 在Java中数组是一个对象

  • 优点:可以随机访问

  • 缺点:需要连续的空间

int [] a = new int[10];

了解完数组,肯定少不了arrylist,arrylist以后我会拿出单独的一篇来总结,我继续往下总结。

二、链表

链表(LinkedList) 虽然是一种线性表,但是并不会按线性的顺序存储数据,使用的不是连续的内存空间来存储数据。

链表的插入和删除操作的复杂度为 O(1) ,只需要知道目标位置元素的上一个元素即可。但是,在查找一个节点或者访问特定位置的节点的时候复杂度为 O(n) 。

使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但链表不会节省空间,相比于数组会占用更多的空间,因为链表中每个节点存放的还有指向其他节点的指针。除此之外,链表不具有数组随机读取的优点。

  • 可不断扩容

  • 每个节点由值和next构成

  • 有头插和尾插两种插入方式

假如链表中有n个元素。
访问:O(n)//访问特定位置的元素
插入删除:O(1)//必须要要知道插入元素的位置
 

构建单链表,完成头插和尾插的写法

/*
    构建单链表
    完成头插法,尾插法
 */


//listnode代表一个节点
class ListNode{
    public int val;
    public ListNode next;

    //构造函数
    public ListNode(int a){
        this.val=a;
    }
}
public class LinkedList {
    public static void main(String[] args) {
        LinkedList a = new LinkedList();
        a.creatList();
        a.addFirst(66);
        a.addLast(77);
        a.dispaly();
    }
    //链表的头
    public ListNode head;

    public void creatList(){
        ListNode listNode1 = new ListNode(11);
        ListNode listNode2 = new ListNode(22);
        ListNode listNode3 = new ListNode(33);
        ListNode listNode4 = new ListNode(44);
        ListNode listNode5 = new ListNode(55);

        this.head = listNode1;

        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;

    }

    //头插法
    public void addFirst(int data){
        ListNode node = new ListNode(data);
        node.next = this.head;
        this.head = node;
    }

    //尾插法
    public void addLast(int data){
        ListNode node = new ListNode(data);
        if (this.head == null) {
            this.head = node;
        }else {
            ListNode cur = this.head;
            while (cur.next != null){
                cur = cur.next;
            }
            cur.next = node;
        }
    }
    //打印链表
    public void dispaly(){
        ListNode cur = this.head;
        while (cur != null){
            System.out.print(cur.val+" ");
            cur = cur.next;
        }
        System.out.println();
    }
}

常见链表分类:

  1. 单链表
  2. 双向链表
  3. 循环链表
  4. 双向循环链表

单链表 单向链表只有一个方向,结点只有一个后继指针 next 指向后面的节点。因此,链表这种数据结构通常在物理内存上是不连续的。我们习惯性地把第一个结点叫作头结点,链表通常有一个不保存任何值的 head 节点(头结点),通过头结点我们可以遍历整个链表。尾结点通常指向 null。

 循环链表 其实是一种特殊的单链表,和单链表不同的是循环链表的尾结点不是指向 null,而是指向链表的头结点。

 双向链表 包含两个指针,一个 prev 指向前一个节点,一个 next 指向后一个节点。

双向循环链表 最后一个节点的 next 指向 head,而 head 的 prev 指向最后一个节点,构成一个环。

 

  • 如果需要支持随机访问的话,链表没办法做到。
  • 如果需要存储的数据元素的个数不确定,并且需要经常添加和删除数据的话,使用链表比较合适。
  • 如果需要存储的数据元素的个数确定,并且不需要经常添加和删除数据的话,使用数组比较合适。

链表和数组的区别

  • 数组支持随机访问,而链表不支持。
  • 数组使用的是连续内存空间对 CPU 的缓存机制友好,链表则相反。
  • 数组的大小固定,而链表则天然支持动态扩容。如果声明的数组过小,需要另外申请一个更大的内存空间存放数组元素,然后将原数组拷贝进去,这个操作是比较耗时的!

当然讲了链表就会想到linkedlist,以后我也会单独开一篇总结一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1967127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux操作系统及gcc工具实验报告

Linux操作系统及gcc工具实验 一、 实验目的 1.学习在VMware虚拟机上搭建Linux操作系统。 2.掌握Linux操作系统的环境配置及使用。 3. 学会使用gcc工具编译。 二、 实验环境 硬件:PC机 软件:VMware虚拟机、Linux系统。 三、…

8-springboot集成nacos config

本文介绍spring boot集成nacos config,注意这里和spring cloud没任何关系,单纯基于spring boot。 0、环境 jdk 1.8nacos 2.0.3Idea 2021.1maven 3.8.1 1、springboot搭建 Idea新建maven项目,构建完成后,添加以下依赖&#xff…

新160个crackme - 018-crackme_0006

运行分析 输入Name和Serial,点击Check无反应 PE分析 ASM程序,32位,无壳 静态分析&动态调试 ida找到关键字符串,进入关键函数 通过静态分析和动态调试,得到以下结论 总结:1、String Serial2、String2 是…

JavaScript_语法_运算符_一元运算符

变量_ typeof 运算符: (可以使用 typeof 运算符来确定 JavaScript 变量的数据类型) 注: 复杂数据 typeof 运算符把对象、数组或 null 返回 object。 null被认为是对象的占位符 1.5 运算符 1.一元运算符:只有一个运算数的运算符 eg. A , …

电商平台服务器 IP 地址遭受攻击?

平台突然瘫痪?客户反映无法购物?订单无法查询?电商平台在促销活动期间往往会迎来流量高峰,这就给了网络攻击者可乘之机。服务器 IP 地址遭受恶意攻击,导致网站无法正常访问,就会造成以上后果,给…

【黑马java基础】网络通信

可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。 java提供了java.net.*包下提供了网络编程的解决方案 通信的基本架构主要有两种形式:一种是CS架构(Client 客户端/Server服务端)、一种是…

OceanBase介绍

OceanBase 是什么 OceanBase 是由蚂蚁金服、阿里巴巴完全自主研发的分布式关系型数据库,始创于 2010 年。 OceanBase 具有数据强一致、高可用、高性能、在线扩展、高度兼容 SQL 标准和主流关系型数据库、低成本等特点。OceanBase 至今已成功应用于支付宝全部核心业…

移动端测试如何学,超详细的APP测试攻略送上

前言 随着手机应用市场发展的逐渐成熟,手机APP已经渗透到人们的吃穿住行生活,比如手机支付APP、通讯APP、各大应用软件等,关于手机APP安全性能的重要性不言而喻。 鉴于此,做好手机APP测试对于软件开发方把控产品质量有着重要意义…

运维工作中的事件、故障排查处理思路

一、运维工作中的事件 https://www.51cto.com/article/687753.html 二、运维故障排查 一)故障排查步骤 1、明确故障 故障现象的直接表现故障发生的时间、频率故障发生影响哪些系统故障发生是否有明确的触发条件   故障举例:无法通过ssh登录系统 影响…

KubeSphere 学习之路

云原生KubeSphere最佳实践: https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg4MzcyOTQ2NQ&actiongetalbum&album_id3022627663062056961&scene173&subscene&sessionidsvr_2156d508166&enterid1722492662&from_msgid2247484226&…

简约家居,探秘浦东TOP5装修公司的绿色魔法

在快节奏的现代生活中,家居装修不仅仅是为了美化居住空间,更是一种提升生活品质的方式。特别是对于追求环保和健康生活的业主来说,选择一家能够提供绿色装修服务的公司变得尤为重要。在浦东地区,有几家装修公司因其卓越的绿色装修…

【教程】Linux安装Redis步骤记录

下载地址 Index of /releases/ Downloads - Redis 安装redis-7.4.0.tar.gz 1.下载安装包 wget https://download.redis.io/releases/redis-7.4.0.tar.gz 2.解压 tar -zxvf redis-7.4.0.tar.gz 3.进入目录 cd redis-7.4.0/ 4.编译 make 5.安装 make install PREFIX/u…

从源码看 Redis:深入理解 redisDb 和 redisObject

Redis 是一个广泛使用的内存数据库,以其高性能和丰富的数据结构而闻名。不同于磁盘数据库,磁盘数据库将数据读取到文件中维护,而内存数据库将数据存储在内存中,意味着其想要维护数据,必须在代码中维护一个保存数据的结…

【eNSP模拟实验】STP生成树查询及根桥设置

STP协议的解释和作用 STP协议(Spanning Tree Protocol):生成树协议。是一种工作在OSI网络模型中的第二层(数据链路层)的通信协议,基本应用是防止交换机冗余链路产生的环路。用于确保以太网中无环路的逻辑拓扑结构,从而…

【算法训练记录——Day45】

Day45——动态规划Ⅶ 1.leetcode19_打家劫舍2.leetcode213_打家劫舍Ⅱ3.leetcode337_打家劫舍Ⅲ 1.leetcode19_打家劫舍 思路:我的理解是不能出现连续两次偷窃,即 要么今晚不偷 dp[i] dp[i-1]; 要么今晚开干! dp[i] dp[i-2] nums[i]; 怎么…

NVM 安装node报错 Could not retrieve https://nodejs.org/dist/latest/SHASUMS256.txt.

报错内容: Could not retrieve https://nodejs.org/dist/latest/SHASUMS256.txt. 解决这个办法需要修改nvm的淘宝镜像 在nvm的目录下编辑settings.txt 将下面内容: node_mirror:npm.taobao.org/mirrors/node/ npm_mirror:npm.taobao.org/mirrors/npm/…

酷柚易汛ERP再次迎来升级,八月重拳出击!

1、修复调拨单批量导入下载模版错误 2、修复添加门店选择地址详情报错 3、修复采购清单 关联其他支出单 跳转 之后审核 原采购清单 关联其他支出单消失问题 4、修复以销订购 填了了采购数量 仍然提示请填写本次采购数量问题 5、修复应付款/收款明细表 单据编号是 核销单/其他…

Linux第八节 - make / mikefile

一、补充与复习 Linux在运行可执行程序的时候,有两种运行方式: ./mytest (表示当前路径下的可执行程序 - 用/分隔开) /home/shy/108/lesson8/mytest (也可以运行程序,但是是在绝对路径下!&…

图观 | 嬴图GraphRAG在博物馆文物馆藏中的应用探讨

图数据库技术是AI走向强人工智能的必经之路和重器!因为图数据库(含知识图谱)最大限度还原(模拟)了人的思维和思考方式。 —— 摘自孙宇熙《图数据库原理、架构与应用》 前言: 博物馆文物馆藏管理和观众服务…