Java数据结构-链表与LinkedList

链表

链表的概念

链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。

通俗来说,相比较于顺序表(物理上连续,逻辑上也连续),链表物理上不一定连续。

链表是由一个一个节点组织起来的,组织起来的整体就叫做链表。

链表的结构非常多样,

1.单向或双向

2.带头或不带头

3.循环或非循环

以上的链表结构可以组成八种链表。

在Java集合框架中的LinkedList底层实现的是无头双向循环链表

LinkedList模拟实现

1.创建一个无头双向链表,并标志头结点个尾结点。

static class ListNode {public int val;public ListNode prev;//前驱public ListNode next;//后继public ListNode(int val) {this.val = val;}}public ListNode head;//标志头节点public ListNode last;//标志尾结点
2.计算双向链表的长度:

从head开始遍历节点到尾结点,并定义一个变量count计数。

public int size(){int count = 0;ListNode cur = head;while (cur != null) {count++;cur = cur.next;}return count;}

这里有一个问题,为什么遍历的条件是(cur!=null)?而不是(cur.next!=null)?

我们可以知道,此链表的尾结点next位置存的是null,如果以(cur.next!=null)作为判断条件,

那么当执行完循环中最后一条语句“cur = cur.next;”时,此时由于尾结点的next为空,所以会跳出循环,相当于count少进行了一次计数,那么最终的count值就是错误的。

3.查找是否包含关键字key在链表中
public boolean contains(int key){ListNode cur = head;while (cur != null) {if(cur.val == key) {return true;}cur = cur.next;}return false;}
4.头插法

关键步骤:

        node.next = head;

        head.prev = node;

        head = node;

public void addFirst(int data){ListNode node = new ListNode(data);if(head == null) {//是不是第一次插入节点head = last = node;}else {node.next = head;head.prev = node;head = node;}}
5.尾插法:

关键步骤:

        last.next = node;

        node.prev = last;

        last = last.next;

public void addLast(int data){ListNode node = new ListNode(data);if(head == null) {//是不是第一次插入节点head = last = node;}else {last.next = node;node.prev = last;last = last.next;}}

6.任意位置插入:

关键步骤:

        先记录要插入位置上的节点,记为cur,然后直接修改指向

        node.next = cur;

        cur.prev.next = node;

        node.prev = cur.prev;

        cur.prev = node;

注意:不能修改代码顺序

public void addIndex(int index,int data){try {checkIndex(index);}catch (IndexNotLegalException e) {e.printStackTrace();}//在0位置插入调用头插法if(index == 0) {addFirst(data);return;}//在尾位置插入调用尾插法if(index == size()) {addLast(data);return;}//1. 找到index位置ListNode cur = findIndex(index);ListNode node = new ListNode(data);//2、开始绑定节点node.next = cur;cur.prev.next = node;node.prev = cur.prev;cur.prev = node;}private ListNode findIndex(int index) {ListNode cur = head;while (index != 0) {cur = cur.next;index--;}return cur;}private void checkIndex(int index) {if(index < 0 || index > size()) {throw new IndexNotLegalException("双向链表插入index位置不合法: "+index);}}
7.删除第一次出现关键字为key的节点

关键步骤:

(1)修改前驱指针的next,跳过cur

        cur.prev.next = cur.next;

(2)修改下一个指针的前驱,跳过cur

        cur.next.prev = cur.prev;

public void remove(int key){ListNode cur = head;while (cur != null) {if(cur.val == key) {//开始删除 处理头节点if(cur == head) {head = head.next;if(head != null) {head.prev = null;}else {//head == null 证明只有1个节点last = null;}}else {cur.prev.next = cur.next;if(cur.next == null) {//处理尾巴节点last = last.prev;}else {cur.next.prev = cur.prev;}}return;//删完一个就走}cur = cur.next;}}

8.删除所有值为key的节点

与上一个方法类似,区别是上一个方法删一个之后就退出。

 public void removeAllKey(int key){ListNode cur = head;while (cur != null) {if(cur.val == key) {//开始删除 处理头节点if(cur == head) {head = head.next;if(head != null) {head.prev = null;}else {//head == null 证明只有1个节点last = null;}}else {cur.prev.next = cur.next;if(cur.next == null) {//处理尾巴节点last = last.prev;}else {cur.next.prev = cur.prev;}}}cur = cur.next;}
9.清空链表
public void clear(){ListNode cur = head;while (cur != null) {ListNode curN = cur.next;//cur.val = null;cur.prev = null;cur.next = null;cur = curN;}head = last = null;}

LinkedList

什么是LinkedList?

LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节 点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。

LinkedList实现了List接口。

LinkedList没有实现RandomAccess接口,因此不支持随机访问。

LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)

LinkedList的构造

方法解释
LinkedList()无参构造
public LinkedList(Collection<? extends E> c)
使用其他集合容器中元素构造list
public static void main(String[] args){ //构造一个空的LinkedListList<Integer> list1 = new LinkedList<>();List<String> list2 = new java.util.ArrayList<>();list2.add("JavaSE");list2.add("JavaWeb");list2.add("JavaEE");//使用ArrayList构造LinkedListList<String> list3 = new LinkedList<>(list2);
}

LinkedList其他常用方法介绍

方法解释
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

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

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

相关文章

代码随想录算法训练营第三十一天|动态规划:01背包理论基础、01背包理论基础(滚动数组)

动态规划&#xff1a;01背包理论基础 1. dp[i][j]: 表示0到i个物品放入容量为j的背包中&#xff0c;价值总和最大是多少 2. dp[i][j]的状态取决于&#xff0c;第i个物品要不要放入这个背包。 不放物品i&#xff1a;dp[i-1][j] (其实就是当物品i的重量大于背包j的重量时&…

2023年全国大学生电子信息竞赛E题——自动追踪系统(stm32和openmv+普通舵机)完美解决第四问

当时做的时候&#xff0c;当时看别人开源的23年的题&#xff0c;感觉一头雾水。两个字没思路。确实只有做了才会有思路。我这里清晰的整理出来思路。 1.第一问的复位问题就是写一个函数&#xff0c;如果按键按下&#xff0c;就进入&#xff0c;再按下就退出 当然这个复位是写死…

自学鸿蒙HarmonyOS的ArkTS语言<六>警告弹窗AlertDialog和列表选择弹窗ActionSheet

一、警告弹窗 ... Button(点击我可以获取一个警告弹窗).onClick(() > {AlertDialog.show({title: 我是弹窗标题,subtitle: 我是副标题,message: 我是弹窗内容,autoCancel: true, // 点击遮罩层是否关闭alignment: DialogAlignment.Center, // 弹窗位置offset: { dx: 0, dy:…

【ARMv8/v9 GIC 系列 5.8 -- SPI 中断路由到指定的 core 详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 SPI 中断路由配置寄存器字段代码示例Usage scenarioSPI 中断路由配置 在ARMv8和ARMv9架构下,当启用亲和性路由(Affinity Routing)时,系统寄存器GICD_IROUTER<n>用于提供具有INTID n的SPI的路由信息。n的最大值由公式(32*…

GAN生成对抗网络

GAN生成对抗网络 GANStable Diffusion GAN生成对抗网络子啊2015年横空出世&#xff0c;在当时掀起了巨大轰动&#xff0c;很多人预研它将开创一个全新的学习范式&#xff0c;当时有一个很流行的说法&#xff1a;样本不够&#xff0c;GAN来凑。现如今&#xff0c;大模型当道&…

网络编程!

网络编程 【1】网络开发架构 &#xff08; 1 &#xff09; C / S 架构 C : client &#xff08;客户端&#xff09; S: server (服务端) APP - 就是服务端 C/S 架构通过客户端软件和服务器之间的交互&#xff0c;实现了前端界面和后端业务逻辑的分离&#xff0c;提供了一种…

华为HCIP Datacom H12-821 卷35

单选题 通过display bgp routing-table命令输出的内容如图所示&#xff0c;那么以下关于该内容的描述&#xff0c;正确的是哪一项? A、去往192.168. 1. 0/24网段的路由的MED值是100 B、去往192.168.1. 0/24网段的路由是通过AS200学到的 C、去往192.168.1.0/24网段的路由是通…

<数据集>水稻叶片病害识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1448张 标注数量(xml文件个数)&#xff1a;1448 标注数量(txt文件个数)&#xff1a;1448 标注类别数&#xff1a;3 标注类别名称&#xff1a;[BrownSpot,RiceBlast,BacterialBlight] 序号类别名称图片数框数1Rice…

LLM代理应用实战:构建Plotly数据可视化代理

如果你尝试过像ChatGPT这样的LLM&#xff0c;就会知道它们几乎可以为任何语言或包生成代码。但是仅仅依靠LLM是有局限的。对于数据可视化的问题我们需要提供一下的内容 描述数据:模型本身并不知道数据集的细节&#xff0c;比如列名和行细节。手动提供这些信息可能很麻烦&#…

基于YOLOV8的数粒机-农业应用辣椒种子计数计重双标质量解决方案

一:辣椒种子行业背景调查 中国辣椒年产量稳居世界第一,食辣人口超5亿。中国辣椒全球闻名,小辣椒长成大产业,带动全球食品行业腾飞。 在中国,“辣”是不少地方餐桌上的一大特色。从四川的麻辣火锅到湖南的剁椒鱼头再到陕西的油泼辣子面,由南到北,总有食客对辣有着独一份偏…

Clean My Mac X破解版,让您的电脑跟新的一样好用

Clean My Mac X破解版是一款专门为所有的苹果电脑用户而准备的系统优化工具&#xff0c;这款软件可以支持多种不同版本的Mac系统。我们可以通过Clean My Mac X免激活码破解版来将电脑系统里的各种垃圾文件和垃圾程序进行清理&#xff0c;从而确保系统能够快速运行。 Clean My …

47、lvs之DR

1、DR模式&#xff1a; 1.1、lvs三种模式&#xff1a; nat 地址转换 DR 直接路由模式 tun 隧道模式 1.2、DR模式的特点&#xff1a; 调度器在整个lvs集群当中是最重要的&#xff0c;在nat模式下&#xff0c;即负载接收请求&#xff0c;同时根据负载均衡的算法转发流量&…

未来工业革命:区块链在工业4.0中的角色与应用

随着科技的迅猛发展&#xff0c;人类社会正在逐步迈向工业4.0时代。在这一新时代的背景下&#xff0c;区块链技术作为一种创新性的分布式账本技术&#xff0c;正逐步在工业领域展示其独特的价值和潜力。本文将深入探讨区块链在工业4.0中的角色与应用&#xff0c;分析其对工业生…

Linux C语言基础 day9

目录 思维导图 学习目标&#xff1a; 学习内容&#xff1a; 1. 值传递与地址传递&#xff08;非常重要&#xff09; 1.1 值传递 1.2 地址传递 2. 递归函数 2.1 递归的概念 2.2 递归条件 2.3 递归思想 3. 指针 3.1 指针相关概念 3.2 指针变量的定义 3.2.1. 定义格…

5G/4G加密边缘计算电力网关,开启智慧电力新篇章

计讯物联TG452&#xff0c;一款面向电力行业应用的工业级物联网网关&#xff0c;持电力协议及规约标准&#xff0c;支持采集、存储、算力、通信组网 、协议转换、控制等多功能。    电力应用   计讯物联电力网关TG452支持电力IEC101、IEC104、IEC61850、DL/T645等协议标准…

教育与人的发展

个体身心发展的一般规律 个体身心发展的动因 影响人身心发展的因素

Gentec-eo高功率测量仪激光功率HP60HP100系列软件驱动使用说明

Gentec-eo高功率测量仪激光功率HP60HP100系列软件驱动使用说明

LLM基础模型系列:Fine-Tuning总览

由于对大型语言模型&#xff0c;人工智能从业者经常被问到这样的问题&#xff1a;如何训练自己的数据&#xff1f;回答这个问题远非易事。生成式人工智能的最新进展是由具有许多参数的大规模模型驱动的&#xff0c;而训练这样的模型LLM需要昂贵的硬件&#xff08;即许多具有大量…

百日筑基第十八天-一头扎进消息队列1

百日筑基第十八天-一头扎进消息队列1 先对业界消息队列有个宏观的认识 消息队列的现状 当前开源社区用的较多的消息队列主要有 RabbitMQ、RocketMQ、Kafka 和Pulsar 四款。 国内大厂也一直在自研消息队列&#xff0c;比如阿里的 RocketMQ、腾讯的 CMQ 和 TubeMQ、京东的 JM…

Docassemble interview 未授权任意文件读取漏洞复现(CVE-2024-27292)

0x01 产品简介 Docassemble是一款强大的开源工具,主要用于自动化生成和定制复杂文档,特别是在法律文档处理领域表现出色。由Jonathan Pyle个人开发者开发,是一个免费的开源专家系统,用于指导访谈和文档组装。Docassemble基于Python编写,充分利用了Python的灵活性和广泛的…