Java集合:关于 LinkedList 的内容盘点

本篇内容包括:LinkedList 的概述、LinkedList 的结构既双向链表实现与LinkedList-Node 结构、LinkedList 的使用(构造方法&常用方法)、关于 Queue 队列的介绍、关于 ArrayList 和 LinkedList 的区别以及算法:翻转链表!

一、LinkedList 概述

LinkedList 是用链表作为数据存储结构的 List 集合,链表数据结构的特点是每个元素分配的空间不必连续,因此链表很适合数据的动态插入和删除,但是其随机访问和遍历速度比较慢。另外,LinkedList还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

LinkedList 是以链表实现的,插入、删除时只需要改变前后两个节点指针指向即可,实现了真正的动态,不需要处理固定容量的问题,但是丧失了随机访问的能力 (索引访问)。

LinkedList 是一个双向链表实现,插入、删除时只需要改变前后两个节点指针指向即可,实现了真正的动态,不需要处理固定容量的问题。LinkedList 在当数据量很大或者操作很频繁的情况下,添加和删除元素时具有比 ArrayList 更好的性能。但在元素的查询和修改方面要弱于ArrayList。

LinkedList 与 ArrayList 一样 LinKedList 也不是线程安全的。


二、LinkedList 的结构

1、双向链表实现

LinKedList 的数据存储是基于双向链表实现。

LinkedList 类每个结点用内部类 Node 表示,LinkedList 通过 firstlast 引用分别指向链表的第一个和最后一个元素,当链表为空时,firstlast 都为 NULL 值。

LinkedList

关于 LinKedList 操作数据时:

  • 插入数据(很快):先是在双向链表中找到要插入节点的位置 index,找到之后,再插入一个新节点。 双向链表查找 index 位置的节点时,有一个加速动作:若 index < 双向链表长度的 1/2,则从前向后查找,否则,从后向前查找;
  • 删除数据(很快):先是在双向链表中找到要插入节点的位置 index,找到之后,进行如下操作:node.previous.next = node.next; node.next.previous = node.previous; node = null ,查找节点过程和插入一样;
  • 获取数据(很慢):每次获取数据都需要从 Head 节点从头开始查找;
  • 遍历数据(很慢):同获取数据一样,每次遍历数据都需要从头开始。

2、LinkedList-Node 结构

LinkedList 类内部的 Node 结点代码如下:

    private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}

Node 节点一共有三个属性:item 代表节点值,prev 代表节点的前一个节点,next 代表节点的后一个节点。每个结点都有一个前驱和后继结点,并且在 LinkedList 中也定义了两个变量分别指向链表中的第一个和最后一个结点。


三、LinkedList 的使用

1、构造方法

方法名方法说明
public LinkedList()此构造函数用于构造一个空列表。
public LinkedList(Collection<? extends E> c)此构造函数将按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表

2、常用方法_作为队列(Linked继承了Queue)

方法名方法说明
boolean add(E e)此方法将指定的元素追加到此列表/队列的末尾
E remove()此方法检索并删除此列表的头部(第一个元素),如果此列表为空,则报错
E removeFirst()此方法删除并返回此列表中的第一个元素,如果此列表为空,则报错
E removeLast()此方法检索并删除此列表的最后一个元素,如果此列表为空,则报错
E poll()此方法检索并删除此列表的头部(第一个元素)
E pollFirst()此方法检索并删除此列表的第一个元素,如果此列表为空,则返回null
E pollLast()此方法检索并删除此列表的最后一个元素,如果此列表为空,则返回null
E element()此方法检索但不删除此列表的头部(第一个元素)

3、常用方法_作为栈(FILO 先进后出的栈)

方法名方法说明
void push(E e)此方法将元素推送到此列表所表示的堆栈上
E pop()此方法从此列表表示的堆栈中弹出一个元素
E peek()此方法检索但不删除此列表的头部(第一个元素)
E peekFirst()此方法检索但不删除此列表的第一个元素,如果此列表为空,则返回null
E peekLast()此方法检索但不删除此列表的最后一个元素,如果此列表为空,则返回null

4、常用方法_作为链表

方法名方法说明
void add(int index, E e)此方法将指定的元素插入此列表中的指定位置。
E remove(int index)此方法删除此列表中指定位置的元素
E remove(Object o)此方法从该列表中删除指定元素的第一个匹配项(如果存在)
E set(int index, E e)此方法使用指定的元素替换此列表中指定位置的元素
E get(int index)此方法返回此列表中指定位置的元素
E getFirst()此方法返回此列表中的第一个元素
E getLast()此方法返回此列表中的最后一个元素
int size()此方法返回此列表中的元素数
boolean contains(Object o)如果此列表包含指定的元素,则此方法返回true
boolean isEmpty()如果此列表为空,则此方法返回true
int indexOf(Object o)此方法返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1
int lastIndexOf(Object o)此方法返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1
void clear()此方法将从此列表中删除所有元素
Object clone()此方法返回返回此LinkedList的浅表副本
Object[] toArray()此方法以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组
<T> T[] toArray(T[] a)此方法以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组,返回数组的运行时类型是指定数组的运行时类型

四、相关知识点

1、关于 Queue 队列

队列(Queue):也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。

FIFO 队列

这和我们日常生活中的排队是一致的,最早排队的也是最早离队的。其操作的特性是先进先出(First In First Out, FIFO),故又称为先进先出的线性表。基本上,一个队列就是一个先入先出(FIFO)的数据结构

在Java 中 Queue 接口与 List、Set 同一级别,都是继承了 Collection 接口。LinkedList 实现了 Deque 接口。

2、关于 ArrayList 和 LinkedList 的区别

在结构上,ArrayList 底层是数组,在内存上是连续的;LinkedList 底层是双向链表,在内存上是不连续的

在性能上,ArrayList 由于内存上连续,支持随机查询,查询速度更快,但是在增删时由于会涉及到,数据的移动和数组的扩容,往往是要慢于 LinkedList 的,但并不绝对,可以提前设置好足够的数组空间,并采用尾插的方式

3、算法:翻转链表

假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。

在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

class Solution {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode next = curr.next;curr.next = prev;prev = curr;curr = next;}return prev;}
}

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

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

相关文章

shell自动化巡检

#!/bin/bash #主机信息每日巡检IPADDR$(ifconfig eth0|grep inet addr|awk -F [ :] {print $13}) #环境变量PATH没设好&#xff0c;在cron里执行时有很多命令会找不到 export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin source /etc/profile…

Java集合:关于 Vector 的内容盘点

Vector 与 ArrayList 一样&#xff0c;也是通过数组实现的&#xff0c;不同的是它支持线程的同步&#xff0c;即某一时刻只有一个线程能够写 Vector&#xff0c;避免多线程同时写而引起的不一致性&#xff0c;但实现同步需要很高的花费&#xff0c;因此&#xff0c;访问它比访问…

memcached 的基本命令

memcached 的基本命令(安装、卸载、启动、配置相关)&#xff1a; -p 监听的端口 -l 连接的 IP 地址, 默认是本机 -d start 启动 memcached 服务 -d restart 重起 memcached 服务 -d stop|shutdown 关闭正在运行的 memcached 服务 -d install 安装 memcached 服务 -d uninstall …

Java集合:关于 HashSet 的内容盘点

哈希表存放的是哈希值&#xff0c; HashSet 存储元素的顺序并不是按照存入时的顺序&#xff08;和 List 显然不同&#xff09; 而是按照哈希值来存的所以取数据也是按照哈希值取得。 &#xff5e; 本篇内容包括&#xff1a;HashSet 概述、HashSet 与 HashMap 的关系以及HashSet…

mysql备份脚本

#!/bin/bash #保留备份个数&#xff0c;会删除时间较早的.dump备份 number3 #设置备份保存路径&#xff0c;yourpath替换成自己的备份保存路径 backup_diryourpath #日期格式 dddate %Y%m%d #备份工具 toolmysqldump #数据库用户名 usernameroot #数据库密码&#xff0c;由于密…

Java集合:关于 TreeSet 的内容盘点

TreeSet() 是使用二叉树的原理对新 add() 的对象按照指定的顺序排序&#xff08;升序、降序&#xff09;&#xff0c;每增加一个对象都会进行排序&#xff0c;将对象插入的二叉树指定的位置&#xff1b; ~ 本篇内容包括&#xff1a;TreeSet 概述、TreeSet 的使用以及其他知识点…

python求素数

口求100内的素数 -个数能被从2开始到自己的平发根的正整数整数整除,就是合数 import math n100 for X in range(2, n): for i in range(2, math.ceil(math.sqrt(x))): if x %i 0: break else: print(x)口求100内的素数 合数一定可以分解为几个质数的乘积 import math n100 pri…

svn钩子脚本

REP0S"$1" REV"$2"export LANGen_US.UTF-8 LOGPATH"/app/log" [ !-d ${LOGPATH}] && mkdir $[LOGPATH) -p #update content from svn↓14 SVN/usr/bin/svn↓ SVN update --username test --password test /data/ if[ $? -eq ] then /us…

shell判断字符串是否为数字

#1.组合语法判断1: [ -n "echo $num|sed s/[0-9]//g" -a -n "echo $2|sed s/[0-9]//g"] &&\echo”两个参数都必须为数字”&& exit 1#2.组合语法判断2:[ -n "echo $num|sed s/[0-9]//g" -a -n "echo $2|sed s/[0-9]//g&…

MySQL:DQL 数据查询语句盘点

本篇内容包括&#xff1a;DQL 的简介、SELECT 语句、WHERE 条件语句、JOIN 连接查询(多表查询)和分组、过滤、排序、分页、子查询的使用。 一、DQL 简介 DQL&#xff08;Data QueryLanguage&#xff09;语句&#xff0c;即数据查询语句 常用的语句关键字有&#xff1a;SELECT…

MySQL:DML 数据操作语句盘点

本篇内容包括&#xff1a;DML 的简介、INSERT 命令、UPDATE 命令、DELETE 命令以及 TRUNCATE 命令的使用。 一、DML 简介 DML&#xff08;Data Manipulation Language&#xff09;语句&#xff0c;即数据操作语句&#xff0c;用于操作数据库对象中所包含的数据。 常用关键字包…

MySQL:DDL 数据定义语句盘点

本篇内容包括&#xff1a;DDL 的简介、SHOW 查看语句、CREATE 创建语句、ALTER 修改语句以及 DROP 删除语句的使用。 一、DDL 简介 DDL&#xff08;Data Definition Language&#xff09;&#xff0c;即数据定义语句&#xff0c;功能就是定义数据库DATabase、表table、索引ind…

MySQL:DCL 数据控制语句盘点

本篇内容包括:DCL 简介、GRANT、REVOKE、COMMIT、ROLLBACK、SAVEPOINT、LOCK命令的使用。 一、DCL 简介 DCL&#xff08;Data Control Language&#xff09;语句&#xff0c;即数据控制语句&#xff0c;用于设置或更改数据库用户或角色权限的语句 常用关键字包括&#xff1a;…

oracle迁移父子数据

现有需求如下&#xff0c;业务组织单元表中id字段数据在另外一个系统全部重复&#xff0c;但需要将此业务单元组织导入另一系统 业务组织单元表Isc_Specialorg_Unit 表中存在ID字段为子节点数据&#xff0c;parent_id为父节点数据&#xff0c;orgpath为组织路径 现在做如下操…

批量更新数据库数据

"update isc22.isc_user t set t.saphrid "&E1&"where t.id "&B1&";"

oracle控制文件

控制文件是数据库里面非常重要的一类文件,它记录了当前实例连接的数据库的结构和行为&#xff0c;并维护数据库的一致性。 初始化参数文件中描述其位置&#xff0c;很小的:二进制文件,一般不要超过100mmount读open一直在用 控制文件只能连接一个database丢失要恢复 …

oracle表空间

概念 表空间和数据文件 ●表空间是逻辑存储概念&#xff0c;一个表空间是一个或多个数据文件的逻辑集合 ●存储对象(表、索引)逻辑的存储在表空间上&#xff0c;而存储对象的数据物理的存放在数据文件上 ●数据库至少需要一个叫做system的表空间&#xff0c;也就是系统表空间 ●…

oracle日志

日志分类 redo log files联机日志或重做日志 archived log files归档日志 1184198alert log files 告警日志 trace files user_ _dump_ _dest 用户信息日志如跟踪会话日志 background dump_ dest进程日志还有其他一-些不常用的日志 v$database的log_mode 数据库归档模式…

MySQL:分库分表知识点盘点

本篇内容包括&#xff1a;数据库瓶颈、分库分表以及分库分表相关问题 一、数据库瓶颈 不管是IO瓶颈&#xff0c;还是CPU瓶颈&#xff0c;最终都会导致数据库的活跃连接数增加&#xff0c;进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是&#xff0c;可用…

oracle的sga

sga SGA的管理 ■有三种方式&#xff1a; ●8i:SGA的总大小由所有内存组件大小之和决定&#xff0c;不能直接定义SCA大小。对内部组件大小的修改必须在数据库重起 后 才能生为&#xff0c;所以叫做SGA的静态管理。 ●9i&#xff…