数据结构-java中链表的存储原理及使用方式

目录

链表(线性表的链式存储)

代码实例:(链表构建,头插+尾插)

LinkedList

LinkedList的使用:

1、构造方法

 2、操作方法

LinkedList 和 ArrayList 的区别


链表(线性表的链式存储)

它可以不断扩容,无固定长度

每一个节点都是由value和next构成

有两种插入的方式:头插法尾插法

代码实例:(链表构建,头插+尾插)

public class Listnode {public int value;public Listnode next; //指针public Listnode(int n) {this.value=n;}
public class Linklist {//定义头指针Listnode head;//头插法public void startAdd(int n) {Listnode listnode=new Listnode(n);listnode.next=head;//新节点的next是原来的首节点head=listnode;//头结点指向新节点实现头插法}//尾插法public void endAdd(int n) {Listnode listnode=new Listnode(n);//判断头结点是否为空,空就通过值传递把新节点传给头节点if(head==null) {head=listnode;return;}//头结点不是空,则往下遍历,一直找到尾结点,此时temp就指向尾结点Listnode temp=head;while(temp.next!=null) {temp=temp.next;}//尾结点的后面插入新节点temp.next=listnode;}//把添加的值打印的方法public void printLink() {Listnode temp=head;while(temp!=null) {System.out.print(temp.value+"->");temp=temp.next;}}
}

测试类:

public class Test {public static void main(String[] args) {Linklist linklist=new Linklist();linklist.endAdd(1);linklist.endAdd(2);linklist.startAdd(0);linklist.startAdd(-1);linklist.startAdd(-2);linklist.printLink();}
}

LinkedList

在Java中,LinkedList(链表)是Java提供的一个实现了List接口的类。是基于双向链表结构实现的

LinkedList的使用:

1、构造方法

1、LinkedList():创建一个空的LinkedList对象。

LinkedList<String> list = new LinkedList<>();

2、LinkedList(Collection<? extends E> c):创建一个包含指定集合中的元素的LinkedList对象。集合中的元素将按照迭代器返回的顺序添加到LinkedList中。

List<String> collection = new ArrayList<>();
collection.add("Element 1");
collection.add("Element 2");
LinkedList<String> list = new LinkedList<>(collection);

3、LinkedList(LinkedList<? extends E> c):创建一个包含指定LinkedList中的元素的LinkedList对象。指定LinkedList中的元素将按照迭代器返回的顺序添加到新的LinkedList中。

LinkedList<String> originalList = new LinkedList<>();
originalList.add("Element 1");
originalList.add("Element 2");
LinkedList<String> newList = new LinkedList<>(originalList);

 2、操作方法

1、添加元素:

  • add(E element):在链表末尾添加一个元素。
  • addFirst(E element):在链表开头添加一个元素。
  • addLast(E element):在链表末尾添加一个元素。
LinkedList<String> list = new LinkedList<>();
list.add("Element 1");
list.addFirst("Element 0");
list.addLast("Element 2");

2、获取元素:

  • get(int index):获取指定位置的元素。
  • getFirst():获取链表的第一个元素。
  • getLast():获取链表的最后一个元素。
LinkedList<String> list = new LinkedList<>();
list.add("Element 1");
list.add("Element 2");
String element = list.get(0);
String firstElement = list.getFirst();
String lastElement = list.getLast();

3、删除元素:

  • remove(int index):删除指定位置的元素。
  • removeFirst():删除链表的第一个元素。
  • removeLast():删除链表的最后一个元素。
LinkedList<String> list = new LinkedList<>();
list.add("Element 1");
list.add("Element 2");
list.remove(0);
list.removeFirst();
list.removeLast();

4、判断元素是否存在:

  • contains(Object element):检查链表是否包含指定元素。
LinkedList<String> list = new LinkedList<>();
list.add("Element 1");
list.add("Element 2");
boolean containsElement = list.contains("Element 1");

5、获取链表大小和清空链表:

  • size():获取链表中元素的个数。
  • isEmpty():检查链表是否为空。
  • clear():清空链表中的所有元素。
LinkedList<String> list = new LinkedList<>();
list.add("Element 1");
list.add("Element 2");
int size = list.size();
boolean isEmpty = list.isEmpty();
list.clear();

链表的优点:可以高效地插入和删除节点,而无需移动其他节点。

缺点:访问特定位置的节点需要从头部开始遍历,随机访问的效率较低。

LinkedList 和 ArrayList 的区别

首先说说动态数组ArrayList:

这是一个集合类型,在其内部维护了一个数组,可以自动调整其大小以容纳更多的元素。当你向这些集合中添加元素时,如果内部数组已满,它们会自动创建一个更大的新数组(扩容),并将旧数组的元素以及新元素复制到新数组中。

内部数组初始容量:10

触发扩容的条件:原有数组elementData满了之后就会扩容

扩容方式:新容量=原容量+(原容量>>1)

数组优点:可以随机访问,效率极高;缺点:需要连续的空间,而链表结构可以比较好的利用碎片化空间

LinkedList 和 ArrayList 的区别:

底层数据结构:LinkedList底层基于链表实现,而ArrayList底层基于动态数组实现。

插入和删除操作:由于LinkedList是基于链表的数据结构,插入和删除元素的操作比较高效,时间复杂度为O(1),因为只需要调整节点的指针。而ArrayList的底层是动态数组,插入和删除操作需要移动其他元素,时间复杂度为O(n),其中n是元素的数量。

随机访问:ArrayList支持高效的随机访问,可以通过索引快速获取元素,时间复杂度为O(1)。而LinkedList需要从头开始遍历链表才能找到指定位置的元素,时间复杂度为O(n),其中n是索引位置。

内存消耗:由于LinkedList需要额外的指针来维护节点之间的连接关系,因此在存储相同数量的元素时,LinkedList通常会占用更多的内存空间。而ArrayList只需要连续的内存空间来存储元素。

迭代器性能:对于迭代器遍历操作,LinkedList的性能较好,因为只需要遍历链表中的节点即可。而ArrayList在使用迭代器遍历时,由于底层是数组,可能会导致性能稍差。

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

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

相关文章

C语言 ——— 输入两个正整数,求出最小公倍数

目录 何为最小公倍数 题目要求 代码实现 方法一&#xff1a;暴力求解法&#xff08;不推荐&#xff09; 方法二&#xff1a;递乘试摸法&#xff08;推荐&#xff09; 何为最小公倍数 最小公倍数是指两个或者多个正整数&#xff08;除了0以外&#xff09;的最小的公共倍数…

吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.9-2.10

目录 第三门课 结构化机器学习项目&#xff08;Structuring Machine Learning Projects&#xff09;第二周&#xff1a;机器学习策略&#xff08;2&#xff09;(ML Strategy (2))2.9 什么是端到端的深度学习&#xff1f;&#xff08;What is end-to-end deep learning?&#x…

【matlab 投影寻踪】基于PSO算法的最优投影方向优化

一 投影寻踪算法 投影寻踪是处理和分析高维数据的一类统计方法&#xff0c;其基本思想是将高维数据投影到低维&#xff08;1&#xff5e;3维&#xff09;子空间上&#xff0c;寻找出反映原高维数据的结构或特征的投影&#xff0c;以达到研究和分析高维数据的目的。1974年&…

深度学习中的正则化技术 - Dropout篇

序言 在深度学习的浩瀚领域中&#xff0c;模型过拟合一直是研究者们面临的挑战之一。当模型在训练集上表现得近乎完美&#xff0c;却难以在未见过的数据&#xff08;测试集&#xff09;上保持同样优异的性能时&#xff0c;过拟合现象便悄然发生。为了有效缓解这一问题&#xf…

java文本比较解决方案

参考资料 VBA计算页码和行号https://learn.microsoft.com/zh-cn/office/vba/api/word.wdinformation 概述&#xff1a; 最近在做word文档对比的&#xff0c;总结了几种解决方案&#xff0c;记录一下 在java中&#xff0c;常用的文本对比方案有如下几种&#xff1a; 差异比较…

Pycharm 报错 Environment location directory is not empty 解

删除项目中ven文件夹&#xff08;已存在的&#xff09;&#xff0c;然后再添加新的ven虚拟环境就可以了

Richteck立锜科技电源管理芯片简介及器件选择指南

一、电源管理简介 电源管理组件的选择和应用本身的电源输入和输出条件是高度关联的。 输入电源是交流或直流&#xff1f;需求的输出电压比输入电压高或是低&#xff1f;负载电流多大&#xff1f;系统是否对噪讯非常敏感&#xff1f;也许系统需要的是恒流而不是稳压 (例如 LED…

入门C语言只需一个星期(星期三)

点击上方"蓝字"关注我们 01、基本数据类型 char 1 字节 −128 ~ 127 单个字符/字母/数字/ASCIIsigned char 1 字节 −128 ~ 127 -unsigned char 1 字节 0 ~ 255 -int…

【自学安全防御】三、企业双机热备和带宽管理的综合实验

实验拓扑&#xff1a; 实验任务&#xff1a; 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区上网用户限制流…

JavaSE 知识梳理(上)

1. Java语言的特性 简单性、面向对象、分布式、健壮性、安全性、体系结构中立、可移植性、解释性、高能效、多线程、动态性 2. JDK、JRE、JVM之间的关系 JDK(Java Development Kit):Java开发工具包&#xff0c;提供给Java程序员使用&#xff0c;包含了JRE&#xff0c;同时还…

使用Pycharm画图展示在窗口的侧栏Plots中无图像问题

使用Pycharm画图展示在窗口的侧栏Plots中无图像问题 在运行一个python文件时&#xff0c;突然出现侧栏Plots处提供预览的哪里没有出现图片&#xff0c;只有空白。解决方法如下&#xff1a; 找到Tools -> Python Plots&#xff0c;下图&#xff0c;取消勾选use interactive…

django报错(二):NotSupportedError:MySQL 8 or later is required (found 5.7.43)

执行python manage.py runserver命令时报版本不支持错误&#xff0c;显示“MySQL 8 or later is required (found 5.7.43)”。如图&#xff1a; 即要MySQL 8或更高版本。但是企业大所数用的还是mysql5.7相关版本。因为5.7之后的8.x版本是付费版本&#xff0c;贸然更新数据库肯定…

WEB前端07-DOM对象

DOM模型 1.DOM概念 文档对象模型属于BOM的一 部分&#xff0c;用于对BOM中的核心对象document进行操作&#xff0c;它是一种与平台、语言无关的接口&#xff0c;允许程序和脚本动态地访问或更新HTML、XML文档的内容、结构和样式&#xff0c;且提供了一系列的函数和对象来实现…

Vue从零到实战基础篇

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

C语言丢失精度 如何实现高精度计算

&#xff08;1&#xff09;int 类型举例 int &#xff1a;占4个字节&#xff0c;也就是32位&#xff0c;及最大值是2^32-11024*1024*1024*4-14294967295 以上说法错误&#xff0c;因为Int是有符号类型整数&#xff0c;所以最高位是符号位&#xff0c;及int的最大值应该是2^31…

spring是如何解决循环依赖的,为什么不是两级

1. Spring使用三级缓存来解决循环依赖问题 Spring使用三级缓存来解决循环依赖问题&#xff0c;‌而不是使用两级缓存。‌ 在Spring框架中&#xff0c;‌解决循环依赖的关键在于正确地管理Bean的生命周期和依赖关系。‌循环依赖指的是两个或多个Bean相互依赖&#xff0c;‌如果…

VC运营指南:提升亚马逊VC账户销量的策略——WAYLI威利跨境助力商家

亚马逊VC作为供应商中心账户&#xff0c;其运营策略与普通的第三方卖家账户有所不同。想要在此平台上取得卓越的销售业绩&#xff0c;需要深入理解和运用一系列策略。 1、产品策略是基石 深入市场研究&#xff0c;了解消费者的真实需求&#xff0c;是选择产品的关键。只有选对…

vue echarts 柱状图表,点击柱子,路由代参数(X轴坐标)跳转

一 myChart.on(click, (params) > {if (params.componentType series && params.dataIndex ! undefined) {const months this.month_htqd[params.dataIndex]; // 获取点击柱状图的 X 轴坐标值alert(点击了柱状图&#xff0c;值为: ${months});// 根据点击的柱状图…

7.SpringBoot整合Neo4j

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency> 说明&#xff1a;这里引入neo4j的版本跟spring框架的版本有关系。需要注意不同的版本在neo…

poi库简单使用(java如何实现动态替换模板Word内容)

目录 Blue留言&#xff1a; Blue的推荐&#xff1a; 什么是poi库&#xff1f; 实现动态替换 第一步&#xff1a;依赖 第二步&#xff1a;实现word模板中替换文字 模板word&#xff1a; 通过以下代码&#xff1a;&#xff08;自己建一个类&#xff0c;随意取名&#xf…