linkedlist天然支持栈和队列:作队列时用offer/poll实现fifo,作栈时用push/pop实现lifo;底层双向链表使双端操作均为o(1),但随机访问为o(n)。

Java 中的 LinkedList 类实现了 Deque(双端队列)接口,因此天然支持栈(LIFO)和队列(FIFO)两种行为。它不依赖额外包装类,所有操作都通过同一对象的不同方法完成。
作为队列(FIFO)使用
利用 Deque 接口定义的队列语义方法,如 offer() 入队、poll() 出队,保证先进先出:
-
入队:用
offer(e)或add(e)(后者失败时抛异常)——元素添加到队尾(链表末尾) -
出队:用
poll()(空时返回null)或remove()(空时抛异常)——从队首(链表头部)移除 -
查看队首:用
peek()(不移除,空时返回null)
示例:
Queuequeue.offer("a");
queue.offer("b");
System.out.println(queue.poll()); // 输出 "a"
作为栈(LIFO)使用
使用 Deque 提供的栈语义方法,如 push()、pop(),语义更清晰且推荐用于栈场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
入栈:用
push(e)——等价于addFirst(e),元素插入链表头部 -
出栈:用
pop()——等价于removeFirst(),从链表头部移除并返回 -
查看栈顶:用
peek()(注意:此处是看头部,与队列的peek()是同一个方法,但指向不同端)
示例:
Dequestack.push(1);
stack.push(2);
System.out.println(stack.pop()); // 输出 2
底层实现关键点
LinkedList 内部是双向链表,维护 first 和 last 节点引用:
-
push()/offerFirst()→ 插入到first,时间复杂度 O(1) -
pop()/pollFirst()→ 移除first,O(1) -
offer()/offerLast()→ 插入到last,O(1) -
poll()/pollLast()→ 移除last,O(1)
所有双端操作都是常数时间,无需扩容或移动元素,这是它比 ArrayList 更适合作为 Deque 的根本原因。
使用建议与注意事项
- 明确用途时,优先使用语义化方法:
push/pop/peek表栈,offer/poll/peek(配合Queue引用)表队列 - 避免混用同名方法造成歧义:比如
peek()在Queue和Deque中都存在,但始终返回头节点;若需看尾部,用peekLast() -
LinkedList随机访问(get(int))是 O(n),不适合频繁按索引查找 - 单线程场景下性能足够;高并发应考虑
ConcurrentLinkedDeque
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










