难度
思路
双栈实现
- 从主栈依次 pop 到 副栈中,此时相当于链表反转,直接 pop 副栈即可,
- 而新增的可以直接添加到主栈,此时删除、新增不受任何影响。
虽然
删除操作需要遍历集合,但是把时间成本均摊则为_**O(1)**_。class CQueue_3 {private LinkedList<Integer> normal;private LinkedList<Integer> temp;public CQueue_3() {normal = new LinkedList<>();temp = new LinkedList<>();}public void appendTail(int value) {normal.push(value);}public int deleteHead() {if (temp.isEmpty()) {while (!normal.isEmpty()) {temp.push(normal.pop());}}if (temp.isEmpty()) {return -1;} else {return temp.pop();}}}
| 时间复杂度 | O(1) | | —- | —- | | 空间复杂度 | O(n) |
总结
- 双栈组合可以轻易实现
队列需求,其他使用一个栈也可以完成需求,不过时间复杂度很高。 - 对于优化方面,一是频繁插入新节点的则使用
LinkedList对象,底层使用双向链表存储数据,但相应地,需要消耗一定空间。
