原文: https://javatutorial.net/java-linkedlist-example

Java 中的LinkedList类使用双链表来存储元素,并且还提供了链表数据结构。 它实现了ListDeque接口,就像ArrayList 类一样。 就像数组一样,LinkedList是线性数据结构,但是与数组不同,LinkedList中的元素是使用指针链接在一起的。 有一个指向第一个元素的指针,通常称为“头部”。 最后一个元素指向null元素。 此null元素意味着链表中没有任何其他元素。

Java `LinkedList`示例 - 图1

关于 Java 中的LinkedList的重要了解是什么

  • Java 中的LinkedList类允许重复的元素。
  • Java 中的LinkedList类维护插入顺序。
  • Java 中的LinkedList类是不同步的。
  • Java 中的LinkedList类允许快速操作,因为不需要进行任何移位。
  • Java 中的LinkedList类可以是列表,栈甚至队列。

LinkedList的局限性

  • LinkedList类比数组需要更多的内存,因为它们的指针使用存储。
  • 由于我们不能仅通过它们的索引访问每个元素,因此很难遍历链表中的元素。

LinkedList的简单说明

Java `LinkedList`示例 - 图2

Java 中的LinkedList

这里的头是我上面提到的指针,该指针指向第一个元素。 第一个元素(以及链表中的每个单个元素)本质上具有两件事 - 数据和下一个。 数据只是指定元素包含的内容,其次是指向下一个元素的指针。 最后,在图示中我们可以看到 D 指向null,在链表中,null表示列表的末尾。

LinkedList中的构造方法

  1. LinkedList():用于构造一个空列表。
  2. LinkedList(Collection<? extends E> c):用于构造一个包含指定集合元素的列表,这些元素按顺序由集合的迭代器返回。

LinksList中的方法

  1. boolean add(E e):将指定的元素添加到列表的末尾。
  2. void add(int index, E element):将指定的元素添加到指定的位置。
  3. void clear():从列表中删除所有元素。
  4. Object clone():返回ArrayList的浅表副本。
  5. boolean contains(Object o):如果指定的元素在列表中,则返回true
  6. Iterator<E> endingIterator():以反向双端队列的反向顺序返回元素上的迭代器。
  7. E element():从列表中检索第一个元素。
  8. E get(int index):返回列表中指定位置的元素。
  9. int indexOf(Object o)返回列表中指定元素首次出现的索引,如果不存在则返回 -1。
  10. boolean offer(E e):将指定的元素添加为列表的最后一个元素。
  11. E pop():从列表表示的栈中弹出一个元素。
  12. void push(E e):将元素压入列表表示的栈。
  13. E remove():用于检索和删除列表的第一个元素。
  14. E remove(int index):删除列表中指定位置的元素。
  15. int size():返回列表中的元素数。

有关所有方法的文档,请访问 Oracle 官方文档页面

使用add()将元素添加到LinkedList

语法:boolean add(E e)

  1. import java.io.*;
  2. import java.util.LinkedList;
  3. public class LinkedListExample {
  4. public static void main(String args[]) {
  5. LinkedList animals = new LinkedList();
  6. animals.add("Elephant");
  7. animals.add("Tiger");
  8. System.out.println("The list is:" + animals);
  9. list.add("Lion");
  10. // printing the new list
  11. System.out.println("The new List is:" + animals);
  12. }
  13. }

输出

  1. The list is:[Elephant, Tiger]
  2. The new List is:[Elephant, Tiger, Lion]

使用push()将元素推送到LinkedList

语法:LinkedListObject.push(E e)

  1. import java.util.LinkedList;
  2. public class PushExample {
  3. // Main method
  4. public static void main(String[] args)
  5. {
  6. LinkedList<String> animals = new LinkedList<>();
  7. animals.push("Elephant");
  8. animals.push("Tiger");
  9. animals.push("Lion");
  10. // Printing the complete stack.
  11. System.out.println(animals);
  12. }
  13. }

输出

  1. [Lion, Tiger, Elephant]

使用pop()LinkedList弹出元素

语法:LinkedListObject.pop()

  1. import java.io.*;
  2. import java.util.LinkedList;
  3. public class LinkedListExample {
  4. public static void main(String args[]) {
  5. LinkedList animals = new LinkedList();
  6. / Pushing an element in the stack
  7. animals.push("Elephant");
  8. // Pushing an element in the stack
  9. animals.push("Tiger");
  10. // Pop an element from stack
  11. String s = animals.pop();
  12. System.out.println(s);
  13. // Pushing an element in the stack
  14. animals.push("Lion");
  15. // Printing the complete stack.
  16. System.out.println(animals);
  17. }
  18. }

输出

  1. Elephant
  2. [Elephant, Lion]

使用remove()LinkedList移除元素

语法:LinkedList.remove()

  1. import java.io.*;
  2. import java.util.LinkedList;
  3. public class LinkedListExample {
  4. public static void main(String args[])
  5. {
  6. LinkedList<String> animals = new LinkedList<String>();
  7. animals.add("Elephant");
  8. animals.add("Tiger");
  9. animals.add("Lion");
  10. System.out.println("LinkedList:" + animals);
  11. // Remove the head using remove()
  12. animals.remove();
  13. // Print the final list
  14. System.out.println("Final LinkedList:" + animals);
  15. }
  16. }

输出

  1. LinkedList:[Elephant, Tiger, Lion]
  2. Final LinkedList:[Tiger, Lion]

使用clear()清除链表

  1. import java.io.*;
  2. import java.util.LinkedList;
  3. public class LinkedListExample {
  4. public static void main(String args[])
  5. {
  6. LinkedList<String> animals = new LinkedList<String>();
  7. animals.add("Elephant");
  8. animals.add("Tiger");
  9. animals.add("Lion");
  10. System.out.println("Before clear:" + animals);
  11. animals.clear();
  12. System.out.println("After clear: " + animals);
  13. // Adding elements after clearing the list
  14. animals.add("Elephant");
  15. animals.add("Tiger");
  16. animals.add("Lion");
  17. System.out.println("After adding elements to empty list:" + animals);
  18. }
  19. }

输出

  1. Before clear:[Elephant, Tiger, Lion]
  2. After clear: []
  3. After adding elements to empty list:[Elephant, Tiger, Lion]

使用contains()检查LinkedList中是否存在元素

语法:boolean contains(Object o)

  1. import java.io.*;
  2. import java.util.LinkedList;
  3. public class LinkedListExample {
  4. public static void main(String args[]) {
  5. LinkedList<String> animals = new LinkedList<String>();
  6. animals.add("Elephant");
  7. animals.add("Tiger");
  8. animals.add("Lion");
  9. System.out.println("\nIs 'Lion' in the linkedlist: "
  10. + animals.contains("Lion"));
  11. System.out.println("Is'Cat' in the linkedlist: "
  12. + animals.contains("Cat"));
  13. }
  14. }

输出

  1. Is 'Lion' in the linkedlist: true
  2. Is 'Cat' in the linkedlist: false

使用size()获取LinkedList的大小

语法:LinkedList.size()

  1. import java.io.*;
  2. import java.util.LinkedList;
  3. public class LinkedListExample {
  4. public static void main(String args[])
  5. {
  6. LinkedList<String> animals = new LinkedList<String>();
  7. animals.add("Elephant");
  8. animals.add("Tiger");
  9. animals.add("Lion");
  10. System.out.println("The size of the linked list is: "
  11. + animals.size());
  12. }
  13. }

输出

  1. The size of the linked list is: 3

如何遍历链表

有 5 种方法:

  1. For循环
  2. 增强的For循环
  3. While循环
  4. 迭代器
  5. 集合的stream()(Java 8)

For循环

  1. LinkedList<String> linkedList = new LinkedList<>();
  2. for (int i = 0; i < linkedList.size(); i++) {
  3. System.out.println(linkedList.get(i));
  4. }

增强For循环

  1. for (String temp : linkedList) {
  2. System.out.println(temp);
  3. }

While循环

  1. int i = 0;
  2. while (i < linkedList.size()) {
  3. System.out.println(linkedList.get(i));
  4. i++;
  5. }

迭代器

  1. Iterator<String> iterator = linkedList.iterator();
  2. while (iterator.hasNext()) {
  3. System.out.println(iterator.next());
  4. }

集合stream()(Java 8)

  1. linkedList.forEach((temp) -> {
  2. System.out.println(temp);
  3. });