顺序表与链表

前言:

顺序表和链表是属于数据结构中比较基础的知识,我们需要对其进行掌握。在JAVA原生标准库中分别为ArrayList和LinkedList。下图是整个数据结构之间的结构框图

1.ArrayList

背后用来存储数据的是一个数组,所以用ArrayList来进行相关操作时都是对该数组进行操作。ArrayList是一个线性表并且ArrayList实现了List接口。

(1)构造方法:

主要就这两种:

可以看到第一种构造方法,并没有指定顺序表的大小,在源码中亦是如此: 

 我们平时一般都是直接用的ArrayList的无参构造方法,在使用add方法的时候又是正确的,这是为什么?虽然在这里没有进行顺序表大小的分配,但是在add操作时会进行大小的分配:

可以看到当s == elementData.length时,elementData进行了扩容,然后就可以往里添加元素了。

(2)操作:

 解释:

add操作:

ps1:对顺序表进行添加元素,必然在添加到某个时候,就满了(因为背后就是一个数组),下图是add中扩容的原理(grow方法)。

通过grow方法,当数组放满了,会对数组进行1.5倍的扩容 。

addAll操作:

?代表通配符,传入的参数c是否为E的子类或者本身,然后就是c必须实现Collection接口,否则这个方法不能使用。

(3)OJ题:

杨辉三角:

题析:题目告诉我们最终要返回的是一个二维的顺序表(二维数组),所以这个题要使用顺序表来做。首先我们从第一行看,只有一个元素1,与其他行都与众不同,所以这一行(也是一个一维的顺序表)直接放入二维顺序表中。然后观察后面所有行,最前面都有一个元素1,最后面都有一个元素1,中间的元素是由上一行元素和上一行元素的前一个元素相加得来,此时这个题就迎刃而解了。

题解:

 public List<List<Integer>> generate(int numRows) {List<List<Integer>> lists = new ArrayList<>();if(numRows == 0) {return lists;}List<Integer> list0 = new ArrayList<>();list0.add(1);lists.add(list0);//从第一行开始放for(int i = 1; i < numRows; i++) {List<Integer> list = new ArrayList<>();//开头list.add(1);//中间for(int j = 1; j < i; j++) {int value1 = lists.get(i-1).get(j);int value2 = lists.get(i-1).get(j-1);list.add(value1+value2);}//结尾list.add(1);lists.add(list);}return lists;}

2.LinkedList

(1)链表结构:

链表结构有很多种:带头/不带头,单向/双向,循环/非循环,而JAVA标准库中的LinkedList是不带头双向非循环的链表。链表的背后是由很多节点构成的,这些节点又由数据域(存储元素)和指针域(存储下一个节点)构成,默认最后一个节点不指向任何一个节点,所以为最后一个节点的指针域为null。

(2)构造方法:

一般只使用无参构造的方法。它不需要分配大小,它的大小是动态变化的。

(3)操作:

解释:

addFirst操作:

它的时间复杂度是O(1),不论是双向还是单向链表。 

addLast操作:

如果链表是单向的话,时间复杂度就是O(n)(n为链表的大小);如果是双向的话就是O(1)。这里LinkedList进行尾插的操作所需要的时间复杂度就是O(1)。

(4)OJ题:

1.删除链表中等于给定值 val 的所有节点

题解:

 public ListNode removeElements(ListNode head, int val) {if(head == null) {return head;}ListNode prev = head;ListNode cur = head.next;while(cur != null) {if(cur.val == val) {prev.next = cur.next;cur = cur.next;}else {prev = cur;cur = cur.next;}}//这句代码写在最前面就需要while进行,以防头节点是要移除的节点,下一个也是要移除的。if(head.val == val) {head = head.next;}return head;}

2.反转一个单链表。

题析:

题解:

 public ListNode reverseList(ListNode head) {if(head == null) {return null;}if(head.next == null) {return head;}ListNode cur = head.next;head.next = null;while(cur != null) {ListNode curNext = cur.next;cur.next = head;head = cur;cur = curNext;  }return head;}

3.返回中间节点。

题析:

题解:

 public ListNode middleNode(ListNode head) {if(head == null) {return head;}ListNode fast = head;ListNode slow = head;while(fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;}return slow;}

4.链表的回文结构

题析:

题解:
 

  public boolean chkPalindrome(ListNode A) {if(A == null) {return true;}ListNode fast = A;ListNode slow = A;while(fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;}//开始翻转ListNode cur = slow.next;while(cur != null) {ListNode curNext = cur.next;cur.next = slow;slow = cur;cur = curNext;}while(slow != A) {if(slow.val != A.val) {return false;}//这种情况是偶数个元素的判断if(A.next == slow) {return true;}slow = slow.next;A = A.next;}return true;}

3. 顺序表与链表的对比

(1)如果某个背景下需要进行频繁的随机元素访问,那么选用顺序表

(2)如果要进行频繁的插入或者删除某个元素,那么选用链表。

(3)顺序表的大小是事先指定好了的,如果满了则进行扩容,而链表不需要指定大小,添加一个元素,链表的长度加1。

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

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

相关文章

前端面试题23(css3)

关于CSS3的面试题&#xff0c;我们可以从多个维度来探讨&#xff0c;包括但不限于选择器、盒模型、布局技术、动画与过渡、响应式设计等。下面我会列举一些典型的CSS3面试问题&#xff0c;并尽可能提供详细的解答或示例代码。 1. CSS3中新增了哪些选择器&#xff1f; 答案: C…

JAVA之(static关键字、final关键字)

JAVA之&#xff08;static关键字、final关键字&#xff09; 一、 static关键字1、静态变量2、静态方法3、 静态代码块4、例子 二、final关键字1、final修饰类2、 final修饰方法3、修饰变量 一、 static关键字 1、静态变量 private static String str1“staticProperty”2、静…

SAP 无权限的解决

在进行SAP操作过程中&#xff0c;经常会出现无权限的情况&#xff0c;如客户说没有“ABAAL计划外折旧”权限 但是在查看SU01的时候&#xff0c;已经有角色分配了 解决&#xff1a;1、ABAA之后&#xff0c;SU53查看2、 2、PFCG查找到角色手动添加权限对象S_TCODDE,之后更新&…

YOLOv9报错:AttributeError: ‘list‘ object has no attribute ‘view‘

报错信息如下&#xff1a; red_distri, pred_scores torch.cat([xi.view(feats[0].shape[0], self.no, -1) for xi in feats], 2).split( AttributeError: ‘list’ object has no attribute ‘view’ 解决方法&#xff1a; 去yolov9/utils/loss_tal.py把167行代码更改&#…

Trinity:转录组从头组装

安装 #下载安装包 wget -c https://github.com/trinityrnaseq/trinityrnaseq/releases/download/Trinity-v2.15.1/trinityrnaseq-v2.15.1.FULL.tar.gztar -xzvf trinityrnaseq-v2.15.1.FULL.tar.gz cd trinityrnaseq-v2.15.1 make make plugins #安装依赖 mamba install -c bio…

C语言相关内容模块

C语言相关内容模块 1、函数指针定义方式 1、函数指针定义方式 函数指针的具体用法

antdPro的使用

antdPro封装了很多高级组件&#xff0c;很大程度的节约了开发时间 在这记录一下&#xff0c;初次使用&#xff0c;常用的一些属性 <ModalFormtitle"编辑使用记录"open{visible}onFinish{onSave}onOpenChange{onOpenChange}initialValues{updateRecord}width{40%}…

echarts横向立体3D柱状图

实现原理&#xff1a;series中包含两个普通的柱状图bar&#xff0c;其宽度各占一半且设置间距barGap为0&#xff0c;再添加一个象形柱状图pictorialBar&#xff0c;symbol设为菱形diamond&#xff0c;调整其位置大小层级等数据以达到覆盖在柱状图顶部的立体效果。 运行效果&am…

VSCode远程连接Linux服务器

VSCode远程连接Linux服务器 一、下载VSCode二、远程连接Linux服务器2.1 安装插件2.2 连接linux服务器 我用的Linux服务器(腾讯云服务器&#xff0c;如果是虚拟机需要手动去配置ssh)&#xff0c;操作系统是ubuntu 20.04&#xff08;系统如果不一样&#xff0c;可以重装系统&…

【C++】———— 继承

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年7月5日 一、什么是继承&#xff1f; 继承的概念 定义&#xff1a; 继承机制就是面向对象设计中使代码可以复用的重要手段&#xff0c;它允许在程序员保持原有类特性的基础上进行扩展…

JavaSE第10篇:常用类

文章目录 一、Object1、Object使用2、toString3、equals和4、hashCode5、clone6、finalize7、getClass8、wait、notify和notifyAll 二、使用步骤 一、Object 1、Object使用 Object类是所有Java的根父类 如果在类的声明中未使用extends关键字指明其父类&#xff0c;则默认父类…

Hyper-V 性能监控工具

虚拟化是任何组织网络管理战略不可或缺的一部分&#xff0c;对于帮助提高网络效率和资源可用性至关重要。采用虚拟基础架构具有多种好处&#xff0c;例如最大限度地减少停机时间、降低运营成本和提高生产力。 在所有虚拟服务器中&#xff0c;Microsoft Hyper-V因其多功能性和可…

python模块execjs执行js代码报错

python模块execjs执行js代码报错"UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xad in position 125: illegal multibyte sequence" 处理方法&#xff1a;修改subprocess.py 文件中名为__init__函数的编码encoding要将None指定成utf-8

11 个例子讲清spark提交命令参数

目录 提交命名参数详情为什么有这么多参数如何开始学习一些具体的例子1. 基本的Spark应用提交2. 提交带有依赖的Python脚本3. 运行Spark SQL作业4. 提交Spark Streaming作业5. 使用外部包运行Spark作业6. 动态资源分配7. 使用多个配置文件8. GPU 支持9. 自定义日志配置10. 使用…

【EI稳定检索】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

>>>【独立出版&#xff0c;Ei稳定检索】<<< 第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024年09月20-22日 | 中国温州 一轮截稿时间&#xff1a;2024年7月8日 二轮截稿时间&#xff1a;2024年8月5日 大会简介 *会议…

关于put提交不了参数的解决办法

html中form表单只支持GET与POST请求&#xff0c;而DELETE、PUT等method并不支持&#xff0c; 如图所示 参数请求改成RequestBody&#xff0c;用json格式传参即可解决问题

【鸿蒙学习笔记】页面布局

官方文档&#xff1a;布局概述 常见页面结构图 布局元素的组成 线性布局&#xff08;Row、Column&#xff09; 了解思路即可&#xff0c;更多样例去看官方文档 Entry Component struct PracExample {build() {Column() {Column({ space: 20 }) {Text(space: 20).fontSize(15)…

Java版Flink使用指南——自定义无界流生成器

大纲 新建工程自定义无界流 使用打包、提交、运行工程代码 在《Java版Flink使用指南——从RabbitMQ中队列中接入消息流》一文中&#xff0c;我们让外部组件RabbitMQ充当了无界流的数据源&#xff0c;使得Flink进行了流式处理。在《Java版Flink使用指南——将消息写入到RabbitMQ…

STM32智能电网监控系统教程

目录 引言环境准备智能电网监控系统基础代码实现&#xff1a;实现智能电网监控系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;电网监控与优化问题解决方案与优化收尾与总结 1. 引言 智能电网监控系统通过S…

thingsboard v3.7 win编译相关问题记录

遇到的问题总结 node\yarn 相关版本问题 3.7 开始需要 JDK17 ui-ngx 模块 yarn 相关问题报错 报错信息 [INFO] Downloading https://github.com/yarnpkg/yarn/releases/download/v1.22.10/yarn-v1.22.10.tar.gz to D:\soft\maven\com\github\eirslett\yarn\1.22.10\yarn-1.2…