Java LinkedList

LinkedList 是 List 接口的链表实现:每个元素是一个节点,节点保存数据并指向前后节点,像一条手拉手的链子。它擅长频繁的插入、删除,缺点是按下标随机访问较慢,适合“增删多、随机读少”的场景。

链表原理与适用场景

LinkedList 底层是双向链表:插入或删除元素只需改动前后节点的指针,不用像数组那样搬移大片元素,所以中间增删很快。按下标取元素则要从头(或尾)逐个走,比 ArrayList 慢。它同时实现了 Deque 接口,因此能当队列和栈用。

常用方法

LinkedList 比 ArrayList 多了一整套“首尾操作”方法:

方法作用失败行为
addFirst / addLast头部 / 尾部添加抛异常
removeFirst / removeLast删除并返回头部 / 尾部元素抛异常
getFirst / getLast查看头部 / 尾部元素抛异常
offer / poll / peek队列语义的入队 / 出队 / 查看返回 null

完整示例:

import java.util.LinkedList;

public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("苹果");               // 末尾添加
        list.addFirst("香蕉");          // 头部添加
        list.addLast("西瓜");           // 尾部添加
        System.out.println(list);       // 输出:[香蕉, 苹果, 西瓜]

        list.removeFirst();             // 移除头部
        list.removeLast();              // 移除尾部
        System.out.println(list);       // 输出:[苹果]
        System.out.println(list.getFirst());  // 输出:苹果
        System.out.println(list.getLast());   // 输出:苹果
        System.out.println(list.size());      // 输出:1
    }
}

当作队列和栈使用

LinkedList 实现了 Deque(双端队列)接口,既当队列(先进先出),也当栈(后进先出):

import java.util.LinkedList;

public class QueueStackDemo {
    public static void main(String[] args) {
        // 当队列:offer 入队,poll 出队
        LinkedList<String> queue = new LinkedList<>();
        queue.offer("A");
        queue.offer("B");
        System.out.println(queue.poll());   // 输出:A

        // 当栈:push 入栈,pop 出栈
        LinkedList<String> stack = new LinkedList<>();
        stack.push("1");
        stack.push("2");
        System.out.println(stack.pop());    // 输出:2
    }
}

与 ArrayList 对比

对比项ArrayListLinkedList
底层结构动态数组双向链表
按下标随机访问快 O(1)慢 O(n)
中间插入 / 删除慢(搬移元素)快(改指针)
额外内存每节点多存两个指针
适合场景读多写少频繁增删、队列、栈

小结:LinkedList 是双向链表实现的 List,增删快、随机访问慢;它还实现了 Deque,可当队列与栈使用;读多写少的场景应选 ArrayList。

笔记加载中…