You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现LinkedBag的addLikeASet方法:仅添加非重复元素并修复代码问题

修复LinkedBag中addLikeASet方法的实现问题

需求回顾

要实现addLikeASet方法:仅当参数anEntry未存在于链表中时,将其添加到LinkedBag,添加成功返回true;若元素已存在则返回false。例如LinkedBag包含"A""B""C"时,调用addLikeASet("D")返回true并添加"D";调用addLikeASet("C")返回false且不添加元素。

现有代码的问题分析

你写的代码存在以下几个关键问题,导致无法覆盖所有场景:

  • 空指针异常:当firstNode为null时,直接调用firstNode.setData(anEntry)会抛出空指针,因为此时firstNode还未实例化。
  • 相等判断错误:用==判断元素相等,对于引用类型(如String)会比较对象地址而非内容,导致实际相等的元素无法被正确识别。
  • 添加逻辑错误:遍历到链表末尾后,调用n.setData(anEntry)是修改最后一个节点的数据,而非新增一个节点到链表。
  • 未维护计数器:添加成功后没有更新numberOfEntries,导致后续获取集合大小的结果错误。
  • 泛型不规范:遍历节点时使用Node n而非Node<T> n,会有未检查的类型转换警告。

修正后的完整代码

public class LinkedBag<T> implements BagInterface<T> {
    private Node<T> firstNode;
    private int numberOfEntries;

    public LinkedBag() {
        firstNode = null;
        numberOfEntries = 0;
    }

    public int getCurrentSize() {
        return numberOfEntries;
    }

    // 修正后的addLikeASet方法
    public boolean addLikeASet(T anEntry) {
        // 处理null参数
        if (anEntry == null) {
            return false;
        }

        // 检查元素是否已存在
        Node<T> currentNode = firstNode;
        while (currentNode != null) {
            // 用equals判断元素相等,确保引用类型内容匹配
            if (anEntry.equals(currentNode.getData())) {
                return false;
            }
            currentNode = currentNode.getNext();
        }

        // 元素不存在,添加新节点到链表头部(效率更高)
        Node<T> newNode = new Node<>(anEntry, firstNode);
        firstNode = newNode;
        numberOfEntries++;
        return true;
    }

    // Node内部类修正为泛型规范
    private static class Node<T> {
        private T data;
        private Node<T> next;

        public Node(T dataPortion, Node<T> nextNode) {
            data = dataPortion;
            next = nextNode;
        }

        public Node(T dataPortion) {
            this(dataPortion, null);
        }

        public Node<T> getNext() {
            return next;
        }

        public void setNext(Node<T> newNext) {
            next = newNext;
        }

        public T getData() {
            return data;
        }

        public void setData(T data) {
            this.data = data;
        }
    }
}

关键修复点说明

  1. 空指针处理:当链表为空时,直接新建Node实例并赋值给firstNode,避免调用null对象的方法。
  2. 相等判断:改用equals()方法判断元素内容相等,确保字符串等引用类型能被正确识别。
  3. 添加逻辑:创建新节点并添加到链表头部(也可改为尾部,头部添加时间复杂度为O(1)更高效),而非修改现有节点的数据。
  4. 计数器维护:添加成功后递增numberOfEntries,保证集合大小的准确性。
  5. 泛型规范:所有Node相关变量都使用Node<T>,消除类型转换警告。
  6. 统一检查逻辑:合并元素存在性检查为一个完整遍历,覆盖从第一个到最后一个节点的所有情况,避免遗漏。

内容的提问来源于stack exchange,提问作者NoobCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:15:38