数据结构:线性表(上)

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

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

一、数组

数组(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.rhkb.cn/news/388441.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式相关理论详解

目录 1.绪论 2.什么是分布式系统,和集群的区别 3.CAP理论 3.1 什么是CAP理论 3.2 一致性 3.2.1 计算机的一致性说明 1.事务中的一致性 2.并发场景下的一致性 3.分布式场景下的一致性 3.2.2 一致性分类 3.2.3 强一致性 1.线性一致性 a) 定义 a) Raft算法…

Java 并发编程:一文了解 Java 内存模型(处理器优化、指令重排序与内存屏障的深层解析)

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 022 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

14.按钮和多选框

<p>爱好&#xff1a;<input type"checkbox" value"Riding" name"hobby">骑行<input type"checkbox" value"experiment" name"hobby">做实验<input type"checkbox" value"lea…

彻底解决免费avif图片转换jpg

需求背景 最近在捣鼓一些图片,发现avif的图片,本地可以查看,但是上传到网站上提示不支持的格式。于是需要将avif图片转换为jpg的图片。网上好多都是收费的,这里说一下免费的教程。 操作教程 以下的操作教程为win11,win10也大同小异。 1、准备avif图片 # 下面这个网络图…

springboot惠农服务平台-计算机毕业设计源码50601

目录 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 惠农服务平台app 系统分析 2.1 可行性分析 2.2 系统功能分析 2.3 系统用例分析 2.4 系统流程分析 2.5本章小结 3 惠农服务平台app 总体设计 3.1 系统功能模块设计 3.2 数据库设计 表access_token (…

57_2设置Servlet模板、Servlet线程安全问题、跳转

设置Servlet模板 再创建类就有了 模板代码 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import j…

SAP 采购订单审批 Flexible Workflow

目录 1 简介 2 业务数据 1&#xff09;下采购订单&#xff0c;如果订单金额超过 15w 生成 Flexible Workflow 审批 2&#xff09;审批采购订单 - 系统默认主页显示需要审批的采购订单&#xff0c;也可以设置成发邮件提醒 3 后台配置 4 前台主数据定义 1&#xff09;创建…

c++ 智能指针shared_ptr与make_shared

shared_ptr是C11引入的一种智能指针&#xff0c;‌它允许多个shared_ptr实例共享同一个对象&#xff0c;‌通过引用计数来管理对象的生命周期。‌当最后一个持有对象的shared_ptr被销毁时&#xff0c;‌它会自动删除所指向的对象。‌这种智能指针主要用于解决资源管理问题&…

Qt遇到qt自身组件找不到

比如在使用qtcharts的时候&#xff0c;找不到 解决方法&#xff1a; 在cmakelist中添加 find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Charts REQUIRED) 是一个 CMake 命令&#xff0c;用于查找并配置 Qt 库中的特定组件。这条命令的作用是找到 Qt 的主要版本&#xff08;…

ElasticSearch搜索

ES搜索 elastic search 一套搜索引擎技术,主要技术栈包括 Elasticsearch&#xff1a;用于数据存储、计算和搜索 Kibana&#xff1a;用于数据可视化 在数据库模糊查询中,因为不走索引,所以效率很低,而在搜索引擎中,不仅效率高,而且即使出现个别错字,或者用拼音搜索,甚至用同…

路径规划 | Q-learning机器人路径规划算法(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 Q-learning机器人路径规划算法 机器人路径规划&#xff0c;机器人路径避障。求解常见的路径规划问题。内含算法的注释&#xff0c;模块化编程。 强化学习中的价值学习算法是一类重要的强化学习算法&#xff0c;它们通…

ntp服务重启报错Failed to restart ntpd.service: Unit is masked.

问题概述&#xff1a; 重启ntp服务报错Failed to restart ntpd.service: Unit is masked&#xff0c;使用systemctl unmask ntpd.service命令关闭屏蔽还是报错Failed to restart ntpd.service: Unit is masked 解决方法&#xff1a; 重装ntp服务 yum remove ntpyum install…

Go 1.19.4 结构体-Day 09

1. 结构体介绍 1.1 什么是结构体 结构体&#xff08;struct&#xff09;是一种用户定义的类型&#xff0c;它由一系列的字段组成&#xff0c;每个字段都有自己的名称和类型。 结构体也是值类型的&#xff0c;就算加了指针也是&#xff0c;只不过是复制的内存地址。 1.2 为什么…

2024年的AI人工智能风口是Python?一篇文章告诉你为什么!

Python是一种面向对象的、解释型的、通用的、开源的脚本编程语言&#xff0c;它之所以非常流行&#xff0c;我认为主要有三点原因&#xff1a; 1.Python 简单易用&#xff0c;学习成本低&#xff0c;看起来非常干净&#xff1b; 2.Python 标准库和第三库众多&#xff0c;功能…

stack和list

前言 stack和list的使用就不讲了&#xff0c;讲一下模拟实现&#xff0c;然后讲一下deque&#xff0c;最后讲一下优先队列 1. stack的模拟实现 template<class T,class container>//这个container是vector&#xff0c;或者list或者deque&#xff08;后面会说&#xff0…

测试用例之等价类划分、边界值法

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试用例/案例 1、定义&#xff1a;是在测试执行之前&#xff0c;由测试人员编写的指导测试过程的重要文档&#xff0c;主要包括&#xff1a;用例编号、测试目…

Windows安装服务

&#xff08;1&#xff09;下载设置工具 https://nssm.cc/release/nssm-2.24.zip &#xff08;2&#xff09;根据自己系统选择工具32/64版本 &#xff08;3&#xff09;选择版本后进入文件夹&#xff0c;打开cmd命令窗口输入命令&#xff1a;nssm.exe install &#xff08;4&a…

阿里云实时计算Flink在多行业的应用和实践

摘要&#xff1a;本文整理自 Flink Forward Asia 2023 中闭门会的分享。主要分享实时计算在各行业的应用实践&#xff0c;对回归实时计算的重点场景进行介绍以及企业如何使用实时计算技术&#xff0c;并且提供一些在技术架构上的参考建议。内容分为以下四个部分&#xff1a; 业…

SQL Server 端口配置

目录 默认端口 更改端口 示例&#xff1a;更改 TCP 端口 示例&#xff1a;验证端口设置 远程连接测试 示例&#xff1a;使用 telnet 测试连接 配置防火墙 示例&#xff1a;Windows 防火墙设置 远程连接测试 示例&#xff1a;使用 telnet 测试连接 默认端口 TCP/IP: …

jmeter 重试机制

一、功能实现 我们在测试过程中&#xff0c;请求接口可能是因为请求超时&#xff0c;或者接口异常失败&#xff0c;导致整个测试链路验证失败&#xff0c;jmeter重试机制&#xff0c;这个时候就可以避免上述问题发生 二、配置 1、添加线程组 首先&#xff0c;确保你已经在测…