LinkedList通过实现Queue和Deque接口,既可作FIFO队列(用offer/poll/peek),也可作LIFO栈(用push/pop/peekFirst);但需避免混用两套方法,且ArrayDeque在纯队列/栈场景更优。

LinkedList 既能当队列用,也能当栈用,关键在于调用哪组方法——它本身不是 Queue 或 Stack 的子类,而是同时实现了 Queue 和 Deque 接口,因此天然支持两端操作。
当作队列(FIFO)用:遵守先进先出
队列要求从尾部添加、头部取出。LinkedList 提供了符合 Queue 接口规范的方法:
-
offer(E e):在队尾添加元素(推荐,失败时返回 false) -
poll():从队头移除并返回元素(为空时返回 null) -
peek():查看队头元素但不移除(为空时返回 null)
例如:// 模拟排队入场
Queue<String> queue = new LinkedList<>();<br>
queue.offer("张三");<br>
queue.offer("李四");<br>
System.out.println(queue.poll()); // 输出 "张三"
当作栈(LIFO)用:用 Deque 接口更直接
虽然 Stack 类已过时,但 LinkedList 实现了 Deque(双端队列),天然适合模拟栈行为,且线程不安全但高效:
-
push(E e):压栈(等价于addFirst(e)) -
pop():出栈(等价于removeFirst(),空时抛NoSuchElementException) -
peek():查看栈顶(等价于peekFirst())
注意:这里的 peek() 和队列里的同名方法行为不同——它看的是头端(即栈顶),不是队头逻辑上的“首入”,这点容易混淆。
别混用两套方法,否则逻辑错乱
同一 LinkedList 实例若交替使用队列和栈风格的方法,会破坏数据顺序预期:
- 用
offer()加入再用pop()取出 → 实际是取最后加的(像栈),不是最先加的(非队列) - 用
push()压栈再用poll()取出 → 实际也是取栈顶(头端),仍不是 FIFO
建议:明确用途后,只使用对应接口的一组方法。声明类型也尽量体现意图,比如 Queue<E> q = new LinkedList<>(); 或 Deque<E> stack = new LinkedList<>();
和 ArrayDeque 比,选哪个?
两者都实现 Deque,但适用场景略有不同:
-
LinkedList:适合频繁在中间插入/删除(虽不常用),或需 List 接口能力(如 get(index));但随机访问慢(O(n)) -
ArrayDeque:多数场景更优——内存连续、缓存友好、头尾操作更快(O(1)均摊),且不支持 null 元素(可作轻量校验)
纯队列或栈需求,优先考虑 ArrayDeque;只有需要 List 行为时,才选 LinkedList。








