Java链表复制构造函数



我在使用链表的构造函数时遇到了麻烦。它接受一个字符串,并且应该为每个字符创建一个节点。

我得到一个nullpointerexception每次我试图打印出列表。这是否意味着甚至没有创建第一个节点?

下面是我的节点类和列表构造函数。

class CharNode { 
   private char letter; 
   private CharNode next; 
   public CharNode(char ch, CharNode link)
    { 
        ch = letter;
        link = next;
    }
   public void setCharacter(char ch) 
    { 
        ch = letter;
    }
   public char getCharacter() 
    { 
    return letter;
    }
   public void setNext(CharNode next) 
    { 
    this.next = next;
    }
   public CharNode getNext() 
    {
    return next;
    }    
} 

这是构造函数

   // constructor from a String 
   public CharList(String s) { 
    CharNode newNode = head;
    for(int i = 0; i <s.length(); i++)
    {
        newNode = new CharNode(s.charAt(i), null);
        newNode.setNext(newNode);
    }
    }

构造正确吗?

首先,你的属性被调换了!

ch = letter;
link = next;
应该

letter = ch;
next = link;

setter也是一样。

当你在Java中有如下形式的方法:

public void setSomething(String argument){
    this.classMember = argument;
}

通常是你想要的。必须将实参赋值给类成员,而不是相反。

同样,当你调用构造函数时,你有:

newNode = new CharNode(s.charAt(i), null);
newNode.setNext(newNode);

这使得你的"链接"总是指向它自己!考虑一下您需要做些什么才能使前一个Node指向您刚刚创建的节点(也许以某种方式保存它?)

我说的够清楚吗?如果我可以进一步解释,请告诉我。

如pcalcao所说,=将右边的值赋给左边的变量。您需要将ch = letter;更改为letter = ch;,将link = next;更改为next = link;

现在,CharNode newNode = head;行没有任何意义,除非你在给出的代码之前指定了head是什么,但它看起来不像。请记住,在创建链表时,您不会从任何东西开始,因此即使是像head这样的"特殊"节点也必须创建(如果您愿意,可以实例化)。其思想是创建第一个节点(头部),,然后head分配给第一个节点。对于第一个节点之后的每个节点,不需要此步骤,因为您只需将其添加到列表的末尾。

最后,在构造过程中,您将需要对新节点(就像现在一样)和前一个节点的引用,以便进行适当的追加。现在您的代码只是将列表中的下一个节点设置为当前节点,这意味着一旦您创建了新的newNode,您将失去对前一个newNode的引用。

当一个人第一次开始使用链表时,一个很好的方法是一步一步地画出你想要做的事情,然后尝试将其转化为代码。

相关内容

  • 没有找到相关文章

最新更新