【Java】Deque接口与List接口中的remove方法

Deque接口与List接口中的remove方法的区别

太长不看系列: Deque的remove(Object o)。指定的是元素,List的remove(int index),指定的是索引。


在刷力扣113.路径总和 II 时使用Deque的remove方法出现错误,记录一下原因和理清相关概念。

先上代码:
在回溯时应该使用DequeremoveLast方法,错误使用将Dequeremove方法当做Listremove来使用,导致程序结果错误。

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    Deque<Integer> path = new LinkedList<>();
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        if (root == null) return res;
        dfs(root, targetSum);
        return res;
    }

    private void dfs(TreeNode root, int targetSum) {
        path.add(root.val);
        if (root.left == null && root.right == null) {
            if (targetSum == root.val) {
                res.add(new ArrayList<>(path));
            }
            return;
        }
        if (root.left != null) {
            dfs(root.left, targetSum - root.val);
            path.removeLast(); // 此处!!! 错误代码:path.remove(path.size() - 1)
        }
        if (root.right != null) {
            dfs(root.right, targetSum - root.val);
            path.removeLast(); // 此处!!!
        }
    }
}

具体原因:Deque接口中的remove用来移除指定值的元素,List接口中的remove是index

List

List 接口中,remove(int index) 方法是用来移除位于指定位置的元素的。而 LinkedList 实现了 List 接口,所以 path.remove(path.size() - 1) 会尝试移除位于指定索引位置的元素。

Deque

LinkedList 同时也实现了 Deque 接口,而 Deque 接口中有一个方法 remove(Object o),它是用来移除第一次出现的指定元素的。当 path.remove(path.size() - 1) 被调用时,如果 path.size() - 1 正好也是 LinkedList 中的一个整数值,remove 方法可能会将这个整数值误解为要移除的元素,而不是索引。

这会导致两个问题:(使用Deque接口的remove(path.size() - 1))

  1. 如果 path.size() - 1 作为整数值存在于列表中,它会移除这个值的第一次出现,而不是最后一个元素。
  2. 如果 path.size() - 1 作为整数值不存在于列表中,它会抛出 IndexOutOfBoundsException

因此,当使用 LinkedList 作为 Deque 使用时,应该使用 addLastremoveLast 等明确的 Deque 操作来避免可能的混淆和错误。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值