在Java中,ArrayDeque
和LinkedList
都是Deque
接口的实现类,但它们的内部实现和性能特性有一些不同。
ArrayDeque
:内部实现:ArrayDeque
使用动态数组(resizable array)来实现,它允许在两端高效地进行元素的插入和删除操作。
随机访问:由于使用数组实现,ArrayDeque
支持通过索引进行随机访问,因此可以在O(1)的时间复杂度内访问任何位置的元素。
空间复杂度:相对于LinkedList
,ArrayDeque
在存储相同数量的元素时通常使用更少的内存,因为它不需要为每个元素保存额外的指针。
LinkedList
:内部实现:LinkedList
使用双向链表来实现,这使得在两端(头部和尾部)进行元素的插入和删除操作非常高效,但随机访问的性能较差。
非随机访问:由于使用链表实现,LinkedList
不支持通过索引进行直接的随机访问,而是需要从头或尾开始遍历链表。
插入和删除:在中间位置的插入和删除操作相对较快,因为只需要修改相邻节点的指针,而不需要移动整个数组。
ArrayDeque
可能是更好的选择。LinkedList
可能更合适。在选择使用哪个类时,要根据具体的使用场景和性能需求来决定。
package 代码随想录.树.一般数_森林;
import 代码随想录.树.TreeNode;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
public class _101对称二叉树_迭代法 {
/**
* 就你构造两个队列去入栈出栈去比较
* 或者直接在双端队列的两侧去进行比较
*
* @param root
* @return
*/
public boolean isSymmetric(TreeNode root) {
if (root.left == null && root.right == null){ //树中节点数目在范围 [1, 1000] 内
return true;
}
Deque<TreeNode> myDeque = new LinkedList<TreeNode>(); //一般迭代就用LinkedList
myDeque.offerFirst(root.left); //左前右后
myDeque.offerLast(root.right);
while (!myDeque.isEmpty()){
TreeNode leftNode = myDeque.pollFirst();
TreeNode rightNode = myDeque.pollLast();
if (leftNode == null && rightNode == null){
continue;
}
if (leftNode == null || rightNode == null){
return false;
}
if (leftNode.val!= rightNode.val){
return false;
}
myDeque.offerFirst(leftNode.left);
myDeque.offerLast(rightNode.right);
myDeque.offerFirst(leftNode.right);
myDeque.offerLast(rightNode.left);
}
return true;
}
}