将多个项添加到链接列表

时间:2016-12-08 17:57:10

标签: java linked-list data-collection

我正在创建链表的实现,但是我遇到了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);
        }             
    }
}

2 个答案:

答案 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);

它会解决计数问题,因为列表很好。但是一眼就检查你的代码看起来像列表添加代码也是错误的。