顺序表与链表

前言:

顺序表和链表是属于数据结构中比较基础的知识,我们需要对其进行掌握。在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,一经查实,立即删除!

相关文章

【ai】决策树

决策树 决策树是一种监督学习算法,主要用于分类和回归任务。它通过对数据进行树状结构的分割来进行预测。决策树的主要优点包括易于理解和解释、处理数值型和分类型数据的能力以及对特征缩放不敏感。以下是决策树的基本概念和主要应用。决策树的基本概念 节点(Node): 根节…

前端面试题23(css3)

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

面试知识点【java基础篇】

1、一个程序有且仅有一个main方法启动&#xff0c;main方法是作为java程序启动的唯一入口。 public static void main(String[] args) {Student student new Student(11,"111");System.out.println(student);} 权限修饰符&#xff1a;public:修饰一个类是公开的 pub…

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,之后更新&…

JavaScript let 和 const

JavaScript let 和 const 在JavaScript中&#xff0c;let和const是用于声明变量的关键字&#xff0c;它们是在ES6&#xff08;ECMAScript 2015&#xff09;引入的&#xff0c;旨在提供更灵活和安全的变量声明方式。在这篇文章中&#xff0c;我们将深入探讨let和const的关键特性…

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…

Power BI数据分析可视化实战培训

Power BI课程长度&#xff1a; 3天 Power BI培训方式&#xff1a;上海线下/全国在线互动直播 课程背景&#xff1a; Power BI 数据分析课程为期3天&#xff0c;全面深入地探讨了使用Power BI进行数据建模、可视化和分析的各个方面。课程内容囊括了从数据提取和清洗到高级分析…

代码随想录算法训练营:20/60

非科班学习算法day20 | LeetCode235:二叉搜索树的最近公共祖先 &#xff0c;Leetcode701:二叉树的插入操作 &#xff0c;Leetcode450:删除二叉搜索树的节点 介绍 包含LC的两道题目&#xff0c;还有相应概念的补充。 相关图解和更多版本&#xff1a; 代码随想录 (programmer…

VSCode远程连接Linux服务器

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

【python】线程类列表对比操作

需求&#xff1a; python实现一个线程类&#xff0c;初始化有个字段old_list [1,2,3],有个方法每隔5秒随机生成三个1~10 的数字存放在一个列表new_list 中,old_list与new_list对比&#xff0c;求差异&#xff1b; 代码&#xff1a; import threading import time import ran…

【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. 使用…