前言:在Java编程语言中,Java集合框架提供了一组丰富的数据结构,以满足各种应用需求。其中,LinkedList作为一种常用的数据结构,具有独特的优势和广泛的应用场景。
✨✨✨这里是秋刀鱼不做梦的BLOG
✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客
先让我们看一下本文大致的讲解内容:
目录
1.LinkedList的初识
2.LinkedList的创建
3.LinkedList中的常见API
(1)添加元素
(2)删除元素
(3)修改元素
(4)获取元素
4.LinkedList的遍历
(1)使用 for 循环
(2)使用增强型 for 循环
(3)使用 Iterator
(4)使用 ListIterator
(5)直接打印
5.LinkedList与ArrayList的区别
1.LinkedList的初识
在开始学习LinkedList之前,让我们先了解一下什么是LinkedList:
LinkedList(双向链表)是一种基于链表实现的线性数据结构,与ArrayList(顺序表)等基于数组实现的结构不同,它通过节点的引用来管理元素的存储和连接。
其中每个节点包含三个主要部分:数据部分、指向下一个节点的指针(next)和指向前一个节点的指针(prev)。
下图很好的展示了什么是通过节点的引用来管理元素的存储和连接以及双向链表的构成:
—— 通过上边的解释,我相信读者你已经对LinkedList(双向链表)有了自己的初步认知,那么接下来我们从LinkedList在整个集合框架中与其他类与接口的关系来继续介绍LinkedList(双向链表)
LinkedList与其他类与接口的关系:
从上图中我们可以了解到:
1. LinkedList实现了List接口;
2. LinkedList的底层使用了双向链表;
3. LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问;
通过上边的简单介绍,相信读者已经大致的了解了Java中的LinkedList,那么接下来让我们开始正式的来学习Java中的LinkedList(双向链表)吧。
2.LinkedList的创建
在Java中创建LinkedList有两种方式:
方法解释
LinkedList()无参构造
public LinkedList(Collection<? extends E> c)使用其他集合
容器中元素构造List
(1)让我们使用一个案例来看一下使用空参创建LinkedList的方式:
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Element 1");
linkedList.add("Element 2");
linkedList.add("Element 3");
System.out.println("LinkedList: " + linkedList);
(2)让我们使用一个案例来看一下使用使用其他集合容器中元素构造创建LinkedList的方式:
import java.util.LinkedList;
import java.util.ArrayList;
public class LinkedListFromCollection {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("Element 1");
arrayList.add("Element 2");
arrayList.add("Element 3");
// 使用ArrayList创建一个LinkedList
LinkedList<String> linkedList = new LinkedList<>(arrayList);
System.out.println("LinkedList: " + linkedList);
——这样我们就大致的了解了如何创建LinkedList了。
3.LinkedList中的常见API
了解完如何创建一个LinkedList之后,让我们开始学习如何去操作所创建好的LinkedList。以下我们将会从增删查改四个方面来解释有关LinkedList的常用API。
(1)添加元素
add(E e): 在链表末尾添加元素。
add(int index, E element): 在指定位置插入元素。
addFirst(E e): 在链表头部添加元素。
addLast(E e): 在链表尾部添加元素。
接下来让我们使用案例来帮助你进一步理解:
import java.util.LinkedList;
public class LinkedListAddExample {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Element 1");
linkedList.add("Element 2");
linkedList.add(1, "Inserted Element");
linkedList.addFirst("First Element");
linkedList.addLast("Last Element");
System.out.println("final: " + linkedList);
(2)删除元素
remove(): 移除并返回链表的第一个元素。
remove(int index): 移除并返回指定位置的元素。
removeFirst(): 移除并返回链表的第一个元素。
removeLast(): 移除并返回链表的最后一个元素。
让我们使用案例来帮助你进一步理解:
import java.util.LinkedList;
public class LinkedListRemoveExample {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Element 1");
linkedList.add("Element 2");
linkedList.add("Element 3");
System.out.println("Initial LinkedList: " + linkedList);
String removedElement = linkedList.remove();
System.out.println("Removed Element: " + removedElement);
String removedIndexElement = linkedList.remove(1);
System.out.println("Removed Element at Index 1: " + removedIndexElement);
linkedList.addFirst("New First Element");
String removedFirstElement = linkedList.removeFirst();
System.out.println("Removed First Element: " + removedFirstElement);
String removedLastElement = linkedList.removeLast();
System.out.println("Removed Last Element: " + removedLastElement);
System.out.println("final: " + linkedList);
(3)修改元素
set(int index , E element): 修改指定索引位置的元素。
让我们使用案例来帮助你进一步理解:
import java.util.LinkedList;
public class LinkedListSetExample {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Element 1");
linkedList.add("Element 2");
linkedList.add("Element 3");
linkedList.add("Element 4");
System.out.println("Initial LinkedList: " + linkedList);
String oldElement = linkedList.set(2, "New Element");
System.out.println("Replaced Element: " + oldElement);
System.out.println("final: " + linkedList);
(4)获取元素
get(int index): 获取指定位置的元素。
getFirst(): 获取第一个元素。
getLast(): 获取最后一个元素。
indexof(): 获取指定对象的索引(从左到右第一个)
lastindexof(): 获取指定对象的索引(从右到左第一个)
contains(): 是否包含指定元素
让我们使用案例来帮助你进一步理解:
import java.util.LinkedList;
public class LinkedListGetExample {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Element 1");
linkedList.add("Element 2");
linkedList.add("Element 3");
String elementAtIndex = linkedList.get(1);
System.out.println("Element at Index 1: " + elementAtIndex);
String firstElement = linkedList.getFirst();
System.out.println("First Element: " + firstElement);
String lastElement = linkedList.getLast();
System.out.println("Last Element: " + lastElement);
int index = linkedList.indexOf("Element 1");
System.out.println(index);
int lastindex = linkedList.lastIndexOf("Element 3");
System.out.println(lastindex);
boolean contains = linkedList.contains("Element 2");
System.out.println(contains);
通过上边的案例加上解释,相信读者已经了解了Java中LinkedList中的常用API该如何使用了。
4.LinkedList的遍历
在Java中遍历LinkedList的方式有五种:分别是使用 for 循环、使用增强型 for 循环、使用 Iterator、使用 ListIterator、以及直接打印。
——接下来让我们一个一个来进行讲解:
(1)使用 for 循环
import java.util.LinkedList;
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<Integer>();
// 使用 for 循环遍历 LinkedList
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
(2)使用增强型 for 循环
import java.util.LinkedList;
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<Integer>();
// 使用增强型 for 循环遍历 LinkedList
for (Integer element : list) {
System.out.println(element);
(3)使用 Iterator
import java.util.LinkedList;
import java.util.Iterator;
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<Integer>();
// 使用 Iterator 遍历 LinkedList
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
(4)使用 ListIterator
import java.util.LinkedList;
import java.util.ListIterator;
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<Integer>();
// 使用 ListIterator 从前向后遍历 LinkedList
ListIterator<Integer> listIterator = list.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
// 使用 ListIterator 从后向前遍历 LinkedList
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
(5)直接打印
import java.util.LinkedList;
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<Integer>();
// 直接使用 System.out.println 打印 LinkedList
System.out.println(list);
——以上就是Java中遍历LinkedList的五种方式。
5.LinkedList与ArrayList的区别
在学习完了LinkedList之后,有读者就会发问,LinkedList和之前的ArrayList有什么区别呢?以下为LinkedList与ArrayList的区别:
不同点ArrayListLinkedList存储空间上物理上一定连续逻辑上连续,但物理上不一定连续随机
访问支持O(1)不
支持:O(N)头插需要搬移元素,效率低O(N)只需
修改引用的指向,时间复杂度为O(1)插入空间不够时需要扩容没有容量的概念
应用场景元素高效
存储+频繁
访问任意
位置插入和
删除频繁
以上就是LinkedList和之前的ArrayList的区别,读者要在合适的情况下选择合适的数据结构来进行操作。
以上就是本篇文章的全部内容了~~~