我正在尝试创建一个链接的最后一个类,它将存储数据以及数据显示的频率。
例如,如果某人将整数5
添加到链接列表12
次,则当询问5
的频率(getFrequencyOf(5)
时)时,结果应为{ {1}}。
不幸的是,添加到我的链接列表的第一个数字返回的频率低于它应该的频率。我的代码发布在下面。任何关于如何解决这个问题的想法将不胜感激。
12
答案 0 :(得分:4)
add
中的逻辑错误。当您仅完成add
一次(即在第二次add
操作中)时,您跳过第一个节点而不进行测试,因为此时firstNode.next
为null
。
让while (currNode.next != null)
成为while (currNode != null)
。请参阅下面的正确版本(仅针对该特定问题:我没有对所有预期行为进行测试,因为我没有您的规范)。
请注意,代码可以如图所示缩短(之后更多)。开始编写单元测试,你可以更快地发现这样的错误,并且更有信心地重构,以使你的代码更短,更容易理解。
修正:
public void add(T aData)
{
if(firstNode!=null){
boolean found =false;
Node currNode=firstNode;
while(currNode != null){
if(currNode.data.equals(aData)){
currNode.addF();
found=true;
break;
}
currNode= currNode.next;
}
if(!found){
Node tempNode=firstNode;
firstNode= new Node(aData,tempNode);
}
}
else {
firstNode= new Node(aData,null);
}
numOfItems++;
}
更正并缩短:
public void add(T aData)
{
boolean found =false;
Node currNode=firstNode;
while(currNode != null){
if(currNode.data.equals(aData)){
currNode.addF();
found=true;
break;
}
currNode= currNode.next;
}
if(!found){
Node tempNode=firstNode;
firstNode= new Node(aData,tempNode);
}
numOfItems++;
}