LinkedList与链表

发布时间:2026/11/3 18:52:12

LinkedList与链表 一.ArrayList 的特性1. 访问效率高基于数组实现支持随机访问通过索引 get(int index)时间复杂度为 O(1)这是 ArrayList 对比 LinkedList 最核心的优势LinkedList 随机访问是 O(n)。2. 增删效率分场景尾部增删add (E e)/remove (size-1)效率高时间复杂度 O(1)无扩容时中间 / 头部增删add (int index, E e)/remove (int index)需要移动后续元素时间复杂度 O(n)效率低原因数组元素在内存中是连续存储的中间插入 / 删除会导致后续元素整体移位。3. 线程不安全ArrayList 是非线程安全的集合多线程环境下同时读写会导致数据错乱如 ConcurrentModificationException解决方案使用 Collections.synchronizedList(new ArrayList()) 包装成线程安全版本用 CopyOnWriteArrayList并发包下写操作时复制数组读写分离适合读多写少场景。4. 空值与重复元素允许存储 null 值可以通过 add(null) 添加允许存储重复元素如 add(“a”); add(“a”) 是合法的。5. Cloneable 与浅拷贝1.ArrayList 实现了 Cloneable 接口调用 clone() 方法会返回一个新的 ArrayList 实例但同样是浅拷贝2.新 ArrayList 的数组是新对象但数组中的元素引用类型仅复制引用地址示例如果 ArrayList 中存自定义类对象修改原对象会影响克隆后的 ArrayList 元素。二.链表链表的概念和结构链表是一种物理存储结构上非连续存储结构数据元素的逻辑顺序是通过链表中的引用链接次序实现的。一.链表的种类链表的种类有8种其中的主要分类可以是1.带头和不带头带头节点的实现classNode{intdata;Nodenext;publicNode(intdata){this.datadata;this.nextnull;}}classLinkedList{Nodehead;// 头结点不存储实际数据publicLinkedList(){headnewNode(-1);// 初始化头结点}// 添加节点publicvoidadd(intdata){NodenewNodenewNode(data);Nodecurrenthead;while(current.next!null){currentcurrent.next;}current.nextnewNode;}// 删除节点publicvoiddelete(intdata){Nodecurrenthead;while(current.next!null){if(current.next.datadata){current.nextcurrent.next.next;return;}currentcurrent.next;}}}不带头的链表实现classNode{intdata;Nodenext;publicNode(intdata){this.datadata;this.nextnull;}}classLinkedList{Nodehead;// 直接指向第一个有效节点publicLinkedList(){headnull;// 初始化为空}// 添加节点publicvoidadd(intdata){NodenewNodenewNode(data);if(headnull){headnewNode;}else{Nodecurrenthead;while(current.next!null){currentcurrent.next;}current.nextnewNode;}}// 删除节点publicvoiddelete(intdata){if(headnull)return;if(head.datadata){headhead.next;return;}Nodecurrenthead;while(current.next!null){if(current.next.datadata){current.nextcurrent.next.next;return;}currentcurrent.next;}}}关键区别初始化带头结点的链表初始化时创建一个虚拟头节点不带头结点的链表直接初始化为null。插入/删除操作带头结点的链表无需单独处理头节点为空的情况不带头结点的链表需要额外判断头节点是否为空。代码复杂度不带头结点的链表在操作头节点时需要更多边界条件判断带头结点的链表逻辑更统一。2.单向和双向// 单向链表节点classSinglyNode{intdata;SinglyNodenext;}// 双向链表节点classDoublyNode{intdata;DoublyNodenext;DoublyNodeprev;}复杂度对比操作单向链表双向链表插入/删除头部O1O1插入/删除尾部OnO(1)插入/删除中间部O(n)O(1)逆向遍历不支持O(n)3.循环和非循环循环的代码实现片段classNode{intdata;Nodenext;Node(intdata){this.datadata;}}非循环的代码实现片段// 创建循环链表NodeheadnewNode(1);head.nextnewNode(2);head.next.nexthead;// 尾节点指向头节点NodeheadnewNode(1);head.nextnewNode(2);// 尾节点默认next为null循环链表的尾节点指向头节点形成一个闭环结构。这种设计允许从任意节点出发遍历整个链表适用于需要循环访问的场景。非循环链表的尾节点指向null表示链表结束。遍历时需从头节点开始到达尾节点时终止结构简单且直观。二.链表中的重要方法方法作用void addFirst(int data)在头部插入数据void addLast(int data)在尾部插入数据void addIndex(int index,int data)在index位置处插入数据boolean contains(int key)判断key元素是否在链表中void remove(int key)移除链表中的第一次出现的key元素void removeAllKey(int key)移除所有的出现的key元素int size()访问数组的长度void display()打印链表的val值void clear()将链表的元素清空
延伸阅读

更多相关文章

2026/11/3 18:47:09

ByteFF2:AI力场如何实现量子级液体预测突破?

ByteFF2:AI力场如何实现量子级液体预测突破? 【免费下载链接】byteff2 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/byteff2 导语:字节跳动最新发布的ByteFF2力场模型,通过融合图神经网络与量子力学数据…

2026/11/3 18:47:09

RLPR-Qwen2.5:无验证器也能实现推理飞跃?

RLPR-Qwen2.5:无验证器也能实现推理飞跃? 【免费下载链接】RLPR-Qwen2.5-7B-Base 项目地址: https://ai.gitcode.com/OpenBMB/RLPR-Qwen2.5-7B-Base 导语:OpenBMB团队推出的RLPR-Qwen2.5-7B-Base模型,通过创新的RLPR框架实…

2026/11/3 18:47:09

阿里通义Wan2.1图生视频模型轻量化部署与效率优化指南

阿里通义Wan2.1图生视频模型轻量化部署与效率优化指南 阿里通义Wan2.1图生视频模型是一款高性能的AI视频生成工具,能够将文本描述或图像转化为高质量视频内容。本文将从技术原理、环境搭建、参数调优到行业应用四个维度,全面解析该模型的轻量化部署方案与…

2026/11/3 21:48:03

WPS演示交互效果全解析:从考试到职场应用

1. 项目概述作为一名长期从事办公软件培训的讲师,我发现很多学员在准备计算机等级考试(二级WPS)时,对幻灯片交互效果设置这一考点存在普遍困惑。这不仅是考试重点,更是职场演示中的实用技能。今天我就来详细拆解这个知…

2026/11/3 21:48:03

17个成长任务纯接口自动化:从行为事件上报链到自动领奖

做任务系统的自动化测试做了几年,最常被问到的一类问题是:某个成长任务面板上那十几个任务,能不能不点界面,直接用接口一次性跑完。这个问题背后其实藏着一条完整的工程链路——行为事件上报链怎么还原、协议怎么固化、状态怎么推…

2026/11/3 21:48:03

ACPI设备电源状态转换中的三次存在性检查解析

1. ACPIDevicePowerProcessGenericPhase函数背景解析ACPI(Advanced Configuration and Power Interface)作为现代计算机系统中电源管理的核心规范,其设备电源状态转换过程涉及复杂的硬件-软件协同机制。ACPIDevicePowerProcessGenericPhase函…

2026/11/3 21:48:03

动态规划算法详解:从基础概念到经典问题解析

1. 动态规划基础概念解析动态规划(Dynamic Programming)是一种解决复杂问题的算法思想,它通过将原问题分解为相对简单的子问题来求解。这种方法特别适用于具有重叠子问题和最优子结构性质的问题。动态规划的核心思想可以概括为三个关键步骤:定义状态&…

2026/11/3 21:48:03

ESP32-C3 DNS过滤实战:封禁设备、暂停拦截与自定义域名

家里网络里挂一台 ESP32-C3 做 DNS 层面的去广告,这个方案我前后用了小半年,最大感受是:真正决定这套东西好不好用的,不是拦截列表有多大,而是封禁设备、暂停拦截、自定义域名这三件日常操作顺不顺手。装好第一天你会觉…

2026/11/3 21:43:02

MCP协议逆向工程实战:从抓包到Wireshark解析

1. 项目概述:当“逆向工程”撞上“MCP”,热榜登顶背后的真实图景“GitHub今日热榜 | 2026-10-08:逆向工程 MCP 登顶”——这个标题乍看像一则技术快讯,但拆开来看,它其实是一把钥匙,能打开当前软件开发、安…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑