使用LinkedList可高效实现栈和队列:栈利用addFirst()/removeFirst()实现LIFO,队列通过addLast()/removeFirst()实现FIFO,操作均O(1)时间复杂度,无需扩容且内存动态分配。

用
LinkedList
直接输出解决方案即可
LinkedList
addFirst()
removeFirst()
addLast()
removeLast()
对于栈(Stack),其核心是LIFO(Last In, First Out)原则,即最后进入的元素最先出去。我们可以将
LinkedList
addFirst(E e)
addLast(E e)
addFirst()
removeFirst()
removeLast()
getFirst()
getLast()
对于队列(Queue),其核心是FIFO(First In, First Out)原则,即最先进入的元素最先出去。这通常意味着元素从一端进入,从另一端离开。
addLast(E e)
removeFirst()
getFirst()
这种利用
LinkedList
在我看来,
LinkedList
LinkedList
其次,
LinkedList
LinkedList
再者,从内存使用的角度看,虽然每个节点会额外存储前后节点的引用,导致单个元素占用内存稍多于数组,但在某些场景下,这种分散的内存分配反而更灵活。它不会像数组那样要求一块连续的内存空间,这对于内存碎片化严重的系统来说,可能更容易分配到所需空间。当然,这也不是绝对的,具体还得看应用场景和数据量。但总体来说,
LinkedList
当我们需要一个栈时,
LinkedList
1. 入栈 (Push) 将元素压入栈顶。在
LinkedList
addFirst(E e)
// 假设有一个LinkedList实例
LinkedList<String> stack = new LinkedList<>();
stack.addFirst("Element A"); // 栈:[A]
stack.addFirst("Element B"); // 栈:[B, A]
stack.addFirst("Element C"); // 栈:[C, B, A]这里,链表的头部被我们定义为栈的“顶部”。
2. 出栈 (Pop) 从栈顶移除并返回元素。对应
removeFirst()
String poppedElement = stack.removeFirst(); // 移除并返回 "C",栈:[B, A] // 如果栈为空,调用removeFirst()会抛出NoSuchElementException。 // 实际使用时,通常会先检查isEmpty()。
3. 查看栈顶元素 (Peek) 查看栈顶元素,但不移除。对应
getFirst()
String topElement = stack.getFirst(); // 返回 "B",栈:[B, A] // 同样,如果栈为空,会抛出NoSuchElementException。
4. 判断栈是否为空 (isEmpty) 直接使用
isEmpty()
boolean isEmpty = stack.isEmpty(); // 返回false
考量点:
removeFirst()
getFirst()
NoSuchElementException
isEmpty()
pollFirst()
peekFirst()
null
LinkedList
LinkedList
Collections.synchronizedList(new LinkedList<>())
java.util.concurrent
LinkedList
对于队列,
LinkedList
1. 入队 (Enqueue) 将元素添加到队列的尾部。使用
addLast(E e)
// 假设有一个LinkedList实例 LinkedList<Integer> queue = new LinkedList<>(); queue.addLast(10); // 队列:[10] queue.addLast(20); // 队列:[10, 20] queue.addLast(30); // 队列:[10, 20, 30]
这里,链表的尾部是新元素的入口,头部是元素的出口。
2. 出队 (Dequeue) 从队列的头部移除并返回元素。使用
removeFirst()
Integer dequeuedElement = queue.removeFirst(); // 移除并返回 10,队列:[20, 30] // 同样,如果队列为空,removeFirst()会抛出NoSuchElementException。
3. 查看队首元素 (Peek) 查看队首元素,但不移除。使用
getFirst()
Integer frontElement = queue.getFirst(); // 返回 20,队列:[20, 30]
4. 判断队列是否为空 (isEmpty) 直接使用
isEmpty()
boolean isEmpty = queue.isEmpty(); // 返回false
性能分析:
LinkedList
ArrayDeque
LinkedList
java.util.ArrayDeque
ArrayDeque
LinkedList
ArrayDeque
ArrayDeque
LinkedList
ArrayDeque
LinkedList
LinkedList
ArrayDeque
以上就是LinkedList实现队列和栈的技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号