我在使用链表的构造函数时遇到了麻烦。它接受一个字符串,并且应该为每个字符创建一个节点。
我得到一个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
的引用。
当一个人第一次开始使用链表时,一个很好的方法是一步一步地画出你想要做的事情,然后尝试将其转化为代码。