Java中如何向ArrayDeque插入代表null的合法元素避免空指针异常
可行替代方案
以下是几种语法完全合法的实现方案,你可以结合场景选择:
- 替换Deque实现为支持null的LinkedList
这是对你现有代码改动最小的方案,LinkedList作为Deque接口的实现类,offer()方法允许传入null参数,仅需修改队列初始化一行代码即可:
其余逻辑不需要调整,即可正常运行。// 替换原来的ArrayDeque初始化 Deque<TreeNode> queue = new LinkedList<>(); - 自定义哨兵节点代表空值
如果你需要继续使用ArrayDeque(比如对性能有更高要求),可以基于你的业务约束(节点值范围为-100~100)定义一个全局唯一的哨兵节点代表空节点:
插入子节点时做判空替换:// 类内部定义哨兵节点,val取超出节点合法值范围的数即可 private static final TreeNode NULL_SENTINEL = new TreeNode(101);
后续取出节点时,只需判断节点是否等于queue.offer(node.left == null ? NULL_SENTINEL : node.left); queue.offer(node.right == null ? NULL_SENTINEL : node.right);NULL_SENTINEL,即可识别是否为逻辑空节点。 - 用Optional包装节点类型
你也可以将队列的泛型改为Optional<TreeNode>,用标准库的Optional.empty()代表空含义:
取出节点时通过Deque<Optional<TreeNode>> queue = new ArrayDeque<>(); // 插入节点时的写法 queue.offer(Optional.ofNullable(node.left)); queue.offer(Optional.ofNullable(node.right));isPresent()方法判断是否为非空节点即可,符合Java函数式编程规范。
额外逻辑提示
你现有判断对称的逻辑还需要补充空节点的取值匹配规则,比如逻辑空节点的val要设置为不和正常节点重复的值,才能保证层序遍历时的回文校验逻辑正确。
内容的提问来源于stack exchange,提问作者Sea Bean
相关产品推荐
相关产品推荐

