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

