我遇到链表的构造函数问题。它需要一个字符串,并且应该为每个字符创建一个节点。
每当我尝试打印出列表时,我都会得到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);
}
}
我正确地构建它吗?
答案 0 :(得分:2)
首先,你的归因是切换的!
ch = letter;
link = next;
应该是
letter = ch;
next = link;
你的二传手也一样。
当您使用Java格式的方法时:
public void setSomething(String argument){
this.classMember = argument;
}
通常是你想要的。您必须将您的论证分配给您的班级成员,而不是相反。
此外,当您调用构造函数时,您有:
newNode = new CharNode(s.charAt(i), null);
newNode.setNext(newNode);
这使得你的“链接”总是指向自己!考虑一下你需要做什么才能使之前的Node指向你刚刚创建的节点(也许以某种方式保存它?)!
我清楚了吗?如果我能进一步解释,请告诉我。
答案 1 :(得分:0)
正如pcalcao所说,=
将右边的值分配给左侧的变量。您需要将ch = letter;
更改为letter = ch;
,将link = next;
更改为next = link;
现在,行CharNode newNode = head;
不会,除非你指定什么head
是之前你给的代码意味着什么,但它看起来并不像它。请记住,在创建链接列表时,不要从任何内容开始,因此即使是“{1}}之类的”特殊“节点也必须创建(如果您愿意,也可以实例化)。我们的想法是创建第一个节点(头部),然后将head
分配给第一个节点。对于第一个节点之后的每个节点,不需要此步骤,因为您只是添加到列表的末尾。
最后,在构造过程中,您需要引用一个新节点(就像您现在一样)和前一个节点,以便进行适当的追加。现在您的代码仅仅是在列表中的下一个节点设置为当前节点,这意味着一旦你创建一个新的head
,你就失去了参照以前的newNode
在首次开始使用链接列表时,一种很好的方法是逐步绘制出您想要执行的操作,然后尝试将其转换为代码。希望这很有用。