java链表复制构造函数

时间:2011-10-24 23:17:21

标签: java list linked-list

我遇到链表的构造函数问题。它需要一个字符串,并且应该为每个字符创建一个节点。

每当我尝试打印出列表时,我都会得到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);
    }

    }
我正确地构建它吗?

2 个答案:

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

在首次开始使用链接列表时,一种很好的方法是逐步绘制出您想要执行的操作,然后尝试将其转换为代码。希望这很有用。