数据结构——顺序表与链表
1. 基础介绍
1、线性结构:
如果一个数据元素序列满足:
(1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素;
(2)第一个数据元素没有前驱数据元素;
(3)最后一个数据元素没有后继数据元素。
则称这样的数据结构为线性结构。
2. 线性表
3. 顺序表
2. List介绍
1. list(线性表)
| 方法 | 解释 |
|---|---|
| boolean add (E e) | 尾插 e |
| void add (int index, E element) | 将 e 插入到 index 位置 |
| boolean addAll(Collection<? extends E> c) | 尾插 c 中的元素 |
| E remove(int index) | 删除 index 位置元素 |
| boolean remove(Object o) | 删除遇到的第一个 o,传入的是一个对象 |
| E get (int index) | 获取下标 index 位置元素 |
| E set (int index, E element) | 将下标 index 位置元素设置为 element |
| void clear () | 清空 |
| boolean contains(Object o) | 判断 o 是否在线性表中 |
| int indexOf(Object o) | 返回第一个 o 所在下标 |
| int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
| List<E> subList(int fromIndex, int toIndex) | 截取部分list,前开后闭 |
List<Integer> list1 = new LinkedList<>();list1.add(1);list1.add(2);list1.add(3);list1.add(4);list1.add(5);//当我们想删除2这个元素list1.remove(new Integer(5));System.out.println(list1);List<Integer> list3 = list1.subList(1,3);//截取[1,3)list3.set(0,188);System.out.println(list3);System.out.println(list1); 
为什么改变 list3 中的值,list1 也会改变?

2. ArrayList(顺序表)
| 方法 | 解释 |
|---|---|
| ArrayList () | 无参构造 |
| ArrayList(Collection<? extends E> c) | 利用其他 Collection 构建 ArrayList |
| ArrayList(int initialCapacity) | 指定顺序表初始容量 |
ArrayList(Collection<? extends E> c):
![]()
能够引用的类一定是E或E的子类
public static void main(String[] args) {List<Integer> list1 = new LinkedList<>();//LinkedList是List接口的一个实现类,它使用链表数据结构来存储元素list1.add(1);list1.add(2);list1.add(3);List<Integer> list = new ArrayList<>(list1);//将list1中的所有元素复制到新的ArrayList中list.add(1314);System.out.println(list);} ![]()
| 方法 | 解释 |
|---|---|
| LinkedList() | 无参构造 |
3. ArrayList介绍
【说明】1. ArrayList是以泛型⽅式实现的,使⽤时必须要先实例化2. ArrayList实现了RandomAccess接⼝,表明ArrayList⽀持随机访问3. ArrayList实现了Cloneable接⼝,表明ArrayList是可以clone的4. ArrayList实现了Serializable接⼝,表明ArrayList是⽀持序列化的5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使⽤,在多线程中可以选择Vector或者CopyOnWriteArrayList6. ArrayList底层是⼀段连续的空间,并且可以动态扩容,是⼀个动态类型的顺序表
底层扩容
ArrayList<Integer> list2 = new ArrayList<>();list2.add(10);list2.add(20);list2.add(30);list2.add(40);System.out.println(list2);//一般情况下,能够直接通过 sout 输出引用指向对象当中的内容的时候,此时一定重写了 toString 方法System.out.println("===================");//迭代器//方法1:Iterator<Integer> it = list2.iterator();//判断下一个数据是否存在while (it.hasNext()){System.out.print(it.next()+" ");//打印it的下一个数据}System.out.println();System.out.println("===================");//方法2:ListIterator<Integer> it2 = list2.listIterator();//判断下一个数据是否存在while (it2.hasNext()){System.out.print(it2.next()+" ");//打印it2的下一个数据}System.out.println();System.out.println("==================="); 如果我们想逆序打印呢
//逆序打印ListIterator<Integer> it3 = list2.listIterator(list2.size());//判断上一个数据是否存在while (it3.hasPrevious()){System.out.print(it3.previous()+" ");//打印it3的上一个数据}System.out.println();System.out.println("===================");

List<List<E>> list = new ArrayList<>(); 这种结构在Java中表示一个包含多个列表的列表
List<List<E>>: 这是一个泛型声明,表示一个列表的列表。外层列表的每个元素都是一个List<E>,即一个包含类型为E的元素的列表。

ArrayList的问题及思考:1. ArrayList底层使⽤连续的空间,任意位置插⼊或删除元素时,需要将该位置后序元素整体往前或者往后搬移,故时间复杂度为O(N)2. 增容需要申请新空间,拷⻉数据,释放旧空间。会有不⼩的消耗。3. 增容⼀般是呈1.5倍的增⻓,势必会有⼀定的空间浪费。
4. 链表介绍
| 区别 | ArrayList | LinkedList |
|---|---|---|
| 内部实现 |
|
|
| 随机访问 | 通过索引访问元素的时间复杂度为 O(1),非常高效。 | 通过索引访问元素的时间复杂度为 O(n),需要从头或尾遍历链表。 |
| 插入和删除 |
|
|
| 内存占用 | 内存占用相对较小,因为底层是连续的数组。 | 内存占用相对较大,因为每个节点需要额外存储前后指针 |
| 适用场景 |
|
|
总结
-
ArrayList:-
优点:随机访问高效,内存占用小。
-
缺点:插入和删除操作(尤其是中间位置)较慢。
-
适用场景:频繁随机访问,数据量相对固定。
-
-
LinkedList:-
优点:插入和删除操作(尤其是头部和尾部)高效。
-
缺点:随机访问较慢,内存占用大。
-
适用场景:频繁插入和删除操作,数据量变化较大。
-
简单的洗牌算法
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class CardDom {static class Card{public int rank;//牌面值public String suit;//花色public Card(int rank,String suit){this.rank = rank;this.suit = suit;}@Overridepublic String toString() {return "["+rank + " "+ suit+"]" ;}}public static final String[] SUITS = {"♠","♥","♣","♦"};//有一副牌private static List<Card> buyDeck(){List<Card> deck = new ArrayList<>();//创建一个链表存放牌for(int i=0;i<SUITS.length;i++){for(int j=1;j<=13;j++){Card card = new Card(j,SUITS[i]);deck.add(card);//将牌插入}}return deck;}//将交换牌的位置private static void swap(List<Card> deck, int i, int j){Card t = deck.get(i);deck.set(i,deck.get(j));deck.set(j,t);}//洗牌private static void shuffle(List<Card> deck){Random random = new Random();for(int i=deck.size()-1;i>0;i--){int j = random.nextInt(i);swap(deck,i,j);}}//每人发五张牌public static void main(String[] args) {List<Card> desk = buyDeck();System.out.print("买回来的牌:");System.out.println(desk);shuffle(desk);System.out.print("洗过的牌:");System.out.println(desk);List<List<Card>> heads = new ArrayList<>();//三个人玩牌List<Card> head0 = new ArrayList<>();//存放第一个人的牌List<Card> head1 = new ArrayList<>();//存放第二个人的牌List<Card> head2 = new ArrayList<>();//存放第三个人的牌heads.add(head0);heads.add(head1);heads.add(head2);//控制次数for(int i=0;i<5;i++){for (int j=0;j<3;j++){//每次拿零下标的牌Card card=desk.remove(0);//从牌中拿出第一张牌heads.get(j).add(card);//每个人拿到的牌存入对应的顺序表}}System.out.print("第一个人拿的牌");System.out.println(head0);System.out.print("第二个人拿的牌");System.out.println(head1);System.out.print("第三个人拿的牌");System.out.println(head2);System.out.print("剩下的牌:");System.out.println(desk);}} 相关文章:
数据结构——顺序表与链表
1. 基础介绍 1、线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素; (2)第一个数据元素没有前驱数据…...
【uniapp】图片添加canvas水印
目录 需求&背景实现地理位置添加水印 ios补充 需求&背景 需求:拍照后给图片添加水印, 水印包含经纬度、用户信息、公司logo等信息。 效果图: 方案:使用canvas添加水印。 具体实现:上传图片组件是项目里现有的ÿ…...
ElementUI 级联选择器el-cascader启用选择任意一级选项,选中后关闭下拉框
1、启用选择任意一级选项 在 el-cascader 标签上加上配置项: :props"{ checkStrictly: true }"例如: <el-cascaderref"selectedArrRef"v-model"selectedArr":options"optionsList":props"{ checkStri…...
【音视频】ffplay常用命令
一、 ffplay常用命令 -x width:强制显示宽度-y height:强制显示高度 强制以 640*360的宽高显示 ffplay 2.mp4 -x 640 -y 360 效果如下 -fs 全屏显示 ffplay -fs 2.mp4效果如下: -an 禁用音频(不播放声音)-vn 禁…...
5人3小时复刻Manus?开源OpenManus项目全解剖,我的DeepSeek股票报告这样诞生
大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。分享AI算法干货、技术心得。 更多文章可关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! OpenManus是什么 1. 项目背景 OpenManus 是由 MetaGPT 核心团队仅用 3 小时复刻而成的开源…...
【Python运维】用Python自动化AWS资源管理:利用boto3实现高效管理S3桶和EC2实例
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着云计算的普及,AWS(Amazon Web Services)已经成为许多企业和开发者首选的云平台。为了提高工作效率,自动化管理AWS资源成为了一个热…...
django各种mixin用法
在 Django 中,Mixin 是一种用于扩展类功能的设计模式。通过 Mixin,可以在不修改原有类的情况下,为其添加新的方法或属性。Django 中的 Mixin 广泛应用于视图(View)、表单(Form)、模型(Model)等组件中。以下是 Django 中常见 Mixin 的用法和示例: 一、视图(View)中的…...
Java 大视界 -- Java 大数据在智能教育考试评估与学情分析中的应用(112)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
Manus AI : Agent 元年开启.pdf
Manus AI : Agent 元年开启.pdf 是由华泰证券出品的一份调研报告,共计23页。报告详细介绍了Manus AI 及 Agent,主要包括Manus AI 的功能、优势、技术能力,Agent 的概念、架构、应用场景,以及 AI Agent 的类型和相关案例࿰…...
【计算机网络】计算机网络的性能指标——时延、时延带宽积、往返时延、信道利用率
计算机网络的性能指标 导读 大家好,很高兴又和大家见面啦!!! 在上一篇内容中我们介绍了计算机网络的三个性能指标——速率、带宽和吞吐量。用大白话来说就是:网速、最高网速和实时网速。 相信大家看到这三个词应该就…...
FreeRTOS第15篇:FreeRTOS链表实现细节03_List_t与ListItem_t的奥秘
文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 1 FreeRTOS列表的核心数据结构 FreeRTOS的列表实现由两个关键结构体组成:List_t(列表)和ListItem_t(列表项)。它们共同…...
git 添加额外的远程仓库 URL
要使用 git branch -a 查看 net-next 远程仓库中的所有分支,请按照以下步骤操作: 步骤 1: 确保已添加 net-next 远程仓库 如果尚未添加 net-next 远程仓库,请运行以下命令: git remote add net-next git://git.kernel.org/pub/s…...
不同类型光谱相机的技术差异比较
一、波段数量与连续性 多光谱相机 波段数:通常4-9个离散波段,光谱范围集中于400-1000nm。 数据特征:光谱呈阶梯状,无法连续覆盖,适用于中等精度需求场景(如植被分类)。 高光谱相机…...
Swift系列01-Swift语言基本原理与设计哲学
本文将深入探讨Swift的核心原理、设计理念以及与Objective-C的对比 1. Swift与Objective-C的架构差异分析 Swift和Objective-C尽管可以无缝协作,但它们的架构设计存在本质差异。 1.1语言范式 Objective-C是一种动态语言,建立在C语言之上并添加了Smal…...
《OpenCV》——dlib(人脸应用实例)
文章目录 dlib库dlib库——人脸应用实例——表情识别dlib库——人脸应用实例——疲劳检测 dlib库 dlib库的基础用法介绍可以参考这篇文章:https://blog.csdn.net/lou0720/article/details/145968062?spm1011.2415.3001.5331,故此这篇文章只介绍dlib的人…...
以太网通讯
接口开发笔记-WebApi-CSDN博客 以太网常用通讯协议 1、modbus tcp using EasyModbus; using System;class Program {static void Main(string[] args){// 创建Modbus客户端实例ModbusClient modbusClient new ModbusClient("192.168.1.100"); // IP地址modbusCli…...
UDP学习笔记(一)为什么UDP需要先将数据转换为字节数组
UDP 发送数据时需要先将数据转换为字节数组再发送,主要是因为计算机网络传输的最基本单位是“字节”(Byte)。让我们从以下几个方面来深入理解这个设计选择: 1. 计算机网络只能传输“字节” 在网络通信中,无论是 TCP 还…...
数据分析/数据科学常见SQL题目:连续登录用户、留存率、最大观看人数
文章目录 1. SQL的执行顺序是什么?on和join谁先执行,为什么?on和where的区别?2. 已知表user,字段id, date,求新用户的次日留存率3. 已知表user,字段id,date,求每个日期新用户的次日留…...
【Conda】Windows安装conda/Anaconda环境
安装conda并配置powershell 访问该网址,下载安装即可: Anaconda下载 安装完成后,打开Anaconda,并访问Powershell Prompt 弹出Windows Terminal,并正常进入Conda 【非必须】如果不是通过Windows Terminal打开&#x…...
olmOCR:高效精准的 PDF 文本提取工具
在日常的工作和学习中,是否经常被 PDF 文本提取问题困扰?例如: 想从学术论文 PDF 中提取关键信息,却发现传统 OCR 工具识别不准确或文本格式混乱?需要快速提取商务合同 PDF 中的条款内容,却因工具不给力而…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
