【数据结构】你该在什么时候使用 LinkedList

2,122 阅读2分钟

什么是 Java 的 LinkedList?

LinkedList 是 Java 集合框架中的一个类,位于 java.util 包中。它实现了 List 接口,并且是一个双向链表结构,可以高效地进行插入和删除操作。

主要特点

双向链表:每个节点包含指向前一个节点和后一个节点的引用。

动态大小:链表的长度可以根据需要动态变化。

非同步LinkedList 不是线程安全的,如果多个线程同时访问一个 LinkedList 实例,需要手动进行同步处理。

构造方法

LinkedList 提供了两个主要构造方法:

  1. 默认构造方法
   LinkedList<E> list = new LinkedList<>();
  1. 带集合参数的构造方法
    LinkedList<E> list = new LinkedList<>(Collection<? extends E> c);

主要方法

  1. 添加元素
  • add(E e): 在列表末尾添加元素。
  • addFirst(E e): 在列表开头添加元素。
  • addLast(E e): 在列表末尾添加元素(等同于 add(E e))。
  • add(int index, E element): 在指定位置添加元素。
   list.add("element");
   list.addFirst("firstElement");
   list.addLast("lastElement");
   list.add(1, "secondElement");
  1. 获取元素
  • get(int index): 获取指定位置的元素。
  • getFirst(): 获取第一个元素。
  • getLast(): 获取最后一个元素。
    String firstElement = list.getFirst();
    String lastElement = list.getLast();
    String secondElement = list.get(1);
  1. 删除元素
  • remove(): 删除并返回第一个元素。
  • removeFirst(): 删除并返回第一个元素(等同于 remove())。
  • removeLast(): 删除并返回最后一个元素。
  • remove(int index): 删除并返回指定位置的元素。
    list.remove();
    list.removeFirst();
    list.removeLast();
    list.remove(1);
  1. 其他方法
  • size(): 返回链表的元素个数。
  • clear(): 清空链表。
  • contains(Object o): 判断链表是否包含指定元素。
  • isEmpty(): 判断链表是否为空。
  • toArray(): 将链表转换为数组。
   int size = list.size();
   list.clear();
   boolean containsElement = list.contains("element");
   boolean isEmpty = list.isEmpty();
   Object[] array = list.toArray();

优点

  • 动态大小,可以高效地进行插入和删除操作。
  • 实现了双向链表,可以双向遍历。

缺点

  • 由于节点存储了指向前后节点的引用,内存开销较大。
  • 不能随机访问,需要遍历来找到指定位置的元素,时间复杂度为 O(n)。

使用场景

  • 需要频繁插入和删除操作:例如实现队列和栈。
  • 需要动态调整大小:链表可以根据需要动态增加或减少大小。
  • 需要双向遍历:例如实现双向迭代器。

示例代码

下面是一个简单的示例,展示了如何使用 LinkedList

import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();

        // 添加元素
        list.add("Apple");
        list.add("Banana");
        list.addFirst("Orange");
        list.addLast("Grapes");

        // 获取元素
        System.out.println("First Element: " + list.getFirst());
        System.out.println("Last Element: " + list.getLast());

        // 删除元素
        list.removeFirst();
        list.removeLast();

        // 遍历链表
        for (String element : list) {
            System.out.println("Element: " + element);
        }
    }
}

LinkedList 是 Java 集合框架中一个强大的类,适用于需要频繁插入和删除操作的场景。虽然它的随机访问性能不如数组,但它在动态调整大小和双向遍历方面表现出色。理解并掌握 LinkedList 的使用,对提升 Java 编程能力非常有帮助。