本文仅供学习参考!
相关文章链接:
https://www.runoob.com/java/java-linkedlist.html
https://www.developer.com/java/java-linkedlist-class/
https://www.w3schools.com/java/java_linkedlist.asp
Java 中链表的类型
从最基本的角度来说,链表的节点包含数据字段以及指向列表中下一个节点的“下一个”引用(链接):
还有其他类型的链表,例如循环链表,它是一种单链表,其中最后一个节点和下一个字段指向序列中的第一个节点。它就像一个重复的 MP3 曲目列表:
Java LinkedList 类使用双向链表来存储元素。双向链表的节点还包含一个“prev”链接字段,该字段指向序列中的前一个节点。这允许向前和向后遍历:
有关 LinkedList 类的更多信息
LinkedList类与ArrayList共享许多功能。例如,两者都是Collection框架的一部分,并且驻留在java.util包中。然而,作为LinkedList数据结构的实现,元素并不存储在连续的位置,并且每个元素都是包含数据和地址组件的单独对象。LinkedList的另一个区别因素是它的元素称为节点。
如果程序员需要对元素/节点进行大量插入和删除,则 LinkedList比数组或ArrayList更好。缺点是无法直接访问节点;相反,Java 需要从头部开始,沿着链接到达我们希望访问的节点。这使得访问特定节点成为一个耗时的过程。
以下是需要记住的有关 Java LinkedList的一些更重要的功能:
-
LinkedList类可以包含重复的元素。
-
LinkedList类维护插入顺序。
-
LinkedList类是非同步的。
-
如上所述,由于不需要进行换档,因此操作速度很快。
-
LinkedList类可以用作列表、堆栈或队列,因为
LinkedList类实现了List和Deque接口。完整的类声明显示了为什么这是可能的:
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable
如何在 Java 中创建链表
在 Java 中创建链表有两种主要方法。第一种是使用无参构造函数:
LinkedList<Type> linkedList = new LinkedList<>();
这将创建一个空的LinkedList,然后开发人员可以将节点添加到其中:
import java.util.LinkedList;
public class Main
{
public static void main(String[] args) {
LinkedList<String> linkedNodes = new LinkedList<String>();
for (int i=1; i<=5; i++) {
linkedNodes.add("node"+i);
}
// 在指定索引处添加新项
linkedNodes.add(1, "another node1");
System.out.println(linkedNodes);
}
}
另一种选择是使用接受 Collection 的构造函数:
LinkedList<Type> linkedList = new LinkedList<>();
下面是一个示例 Java 程序,它创建一个字符串数组,然后将其转换为List。由于Lists实现了Collections接口,我们可以将其传递给LinkedList构造函数:
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class Main {
// 主驱动器方法
public static void main(String[] args)
{
// 创建字符串数组
String[] nodes = { "node1", "node2", "node3", "node4", "node5" };
// 将数组转换为列表
List<String> nodesList = Arrays.asList(nodes);
// 创建LinkedList并在LinkedList构造函数中传递List
LinkedList<String> linkedList = new LinkedList<>(nodesList);
// 在LinkedList构造函数中传递List
System.out.println(linkedList); //[node1, node2, node3, node4, node5]
}
}
在 Java 中使用 LinkedList 的项目
LinkedList提供了几种允许程序员对LinkedList进行操作的方法,例如:
- 添加元素 – add(item)和add(index, item)
- 访问元素 – get(index)
- 更改元素 – set(index, item)
- 删除元素 – remove(index)
下面是一些 Java 示例,演示了上述所有LinkedList方法的使用:
import java.util.LinkedList;
public class Main
{
public static void main(String[] args) {
LinkedList<String> guitars = new LinkedList<>();
guitars.add("Fender");
guitars.add("Gibson");
guitars.add("Jackson");
System.out.println(guitars);
// 在第二个位置插入新项目
guitars.add(1, "Washburn");
System.out.println(guitars);
// 将Jackson改为Charvel
guitars.set(3, "Charvel");
System.out.println(guitars);
// 删除第一个元素
guitars.remove(0);
System.out.println(guitars);
}
}
程序输出如下所示:
将 LinkedList 视为 Deque 和/或 Queue
由于LinkedList类还实现了Queue和Deque接口,因此我们可以调用两者的方法。以下是一些常用的方法:
- addFirst() – 将指定元素添加到链表的开头
- addLast() – 将指定元素添加到链表末尾
- getFirst() – 返回第一个元素
- getLast() – 返回最后一个元素
- removeFirst() – 删除第一个元素
- removeLast() – 删除最后一个元素
- peek() – 返回链表的第一个元素(头)
- poll() – 返回并删除链表中的第一个元素
- Offer() – 在链表末尾添加指定元素
如果您只对特定于一个接口(即List、Queue或Deque )的方法感兴趣,那么您始终可以将LinkedList实例化为该接口!例如:
// 使用List创建链表
List<String> list = new LinkedList<>();
// 使用Queue创建链表
Queue<String> 队列 = new LinkedList<>();
// 使用 Deque 创建链表
Deque<String> deque = new LinkedList<>();
请记住,将LinkedList实例化为特定接口会限制对该接口提供的方法的访问。因此,在上面的示例中,Queue不能使用Deque或List接口中的方法。
在下面的程序中,LinkList充当Queue,那么为什么不将其实例化为一个Queue 呢?
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
public class Main
{
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
for (int i=1; i<=5; i++) {
queue.add("node"+i);
}
System.out.println(queue);
// 访问第一个元素
String str1 = queue.peek();
System.out.println("Accessed Element: " + str1);
// 访问并移除第一个元素
String str2 = queue.poll();
System.out.println("Removed Element: " + str2);
System.out.println("LinkedList after poll(): " + queue);
// 在末尾添加元素
queue.offer("node6");
System.out.println("LinkedList after offer(): " + queue);
}
}
正如您在下面的程序输出中看到的,只要我们将自己限制为Queue类的方法,一切都会正常工作:
End
Java的LinkedList类是一个双向链表,允许向前和向后遍历。当您需要执行大量元素插入和删除操作或者需要访问Queue和Deque接口的方法时,它通常比数组或ArrayList更可取。