我正在创建链表的实现,但是我遇到了add方法的问题。在使用多个条目对其进行测试后,我的size()
方法始终返回1.我做错了什么。
public class Node {
public int data;
public Node next;
public Node(int data){
this.data = data;
}
}
public class LinkedList {
public Node first;
public Node last;
public LinkedList(){
first = null;
last = null;
}
public void add(int data){
Node newNode = new Node(data);
if(first == null){
first = newNode;
} else {
add(first, newNode);
}
}
public void add(Node currentNode, Node newNode){
if(currentNode.next != null){
add(currentNode.next, newNode);
}
currentNode.next = newNode;
}
public int size(){
if(first == null){
return 0;
}
else{
return size(first);
}
}
public int size(Node currentNode){
//Count Starts At One Because First = 1.
int count = 1;
if(currentNode == null){
return count;
}
else {
count++;
return size(currentNode.next);
}
}
}
答案 0 :(得分:1)
您忘记了else
的2-arg形式的add
。就目前而言,
if(currentNode.next != null){
add(currentNode.next, newNode);
}
currentNode.next = newNode;
将始终将新节点添加到列表中的所有其他节点first
和。如果currentNode.next = newNode
子句中出现else
,则会将其正确添加到最后。
此外,您的size
方法始终返回1
,因为最终分支始终返回1
。要解决此问题,请更改
count++;
return size(currentNode.next);
到
return 1 + size(currentNode.next);
另外,将return count;
替换为return 1;
。
基本上,您的实施几乎是正确的。 size(Node)
应返回以该节点开头的列表大小。如果节点没有next
,则大小为1.否则,其当前节点(1)+剩余尾部的大小。
您应该制作add
的2-arg版本和size
private
的1-arg版本,因为您不希望将列表的内部暴露给公众(事实上,Node
班级也应该是私人班级。)
此外,您永远不会使用班级的last
字段。您可以删除它,也可以使用它来避免在add
中完全需要递归。在后一种情况下,您必须在每次添加新内容时正确更新它。
答案 1 :(得分:0)
代替Vaadin-Package-Version: 1
Vaadin-Widgetsets: org.tepi.filtertable.gwt.FilterTableWidgetset
试试此return size(currentNode.next);
它会解决计数问题,因为列表很好。但是一眼就检查你的代码看起来像列表添加代码也是错误的。