在链接列表中实现一个在列表末尾插入项目的方法时,这就是我想到的代码,
public void insertEnd(Object item){
SListNode current=head;
while(current.next!=null){
current=current.next;
}
current.next=new SListNode(item);
size--;
}
但由于它不起作用,我从一本书中查看并意识到我必须添加一行
current=current.next;
再次在while循环之后,以便代码变为
public void insertEnd(Object item){
SListNode current=head;
while(current.next!=null){
current=current.next;
}
current.next=new SListNode(item);
current=current.next;
size--;
}
为什么有必要添加该行(新代码中的第7行),因为current.next通过行current.next=new SListNode(item);
我的第二个问题是为什么当列表为空时我必须考虑一个单独的案例?我得到一个空指针异常错误。
有人可以用图表来解释吗
答案 0 :(得分:2)
你最后添加的算法看起来很好看,所以你应该检查它是否正常工作。
对于另一个问题虽然它很简单,好像列表是空的,但是head为空。
这意味着SListNode current=head;
将current
设置为null
,然后在您尝试访问current
时就会失败。
答案 1 :(得分:2)
没有线电流= current.next;你将永远陷入while循环,并且在第一次迭代时(第一次插入它会引发异常),永远不会发生新Node的创建。
public class Test2 {
SListNode head;
public void insertEnd(String item) {
SListNode current = head;
while (current.next != null) {
current = current.next;
}
current.next = new SListNode(item);
// this line does not have any meaning, because it is out of while loop scope
current = current.next;
}
public static void main(String[] args) {
Test2 test2 = new Test2();
test2.test();
}
private void test(){
// keeping head reference
head = new SListNode("1");
insertEnd("2");
insertEnd("3");
insertEnd("4");
System.out.println("HEAD "+head.item);
SListNode init = head.next;
while ( init != null ){
System.out.println("ADDED "+init.item);
init = init.next;
}
}
class SListNode {
SListNode next;
String item;
public SListNode(String item) {
this.item = item;
}
}
}
好的,这是一个重建的代码(简化)。使用该行或没有程序正在运行。
答案 2 :(得分:2)
这段代码使用你的while循环逐步浏览你可能很多节点的列表。
while(current.next!=null){
current=current.next;
}
它停在列表节点,其中current.next == null。
此时您可以添加一个新节点调用
current.next = new SListNode(item);
第二个current=current.next;
,你的书可以让你添加,对你的方法没有任何帮助。它将您当前的指针移动到刚创建的节点,但没有完成(或需要)它的工作。
空指针异常: - 当列表为空时,您没有头。这意味着head.next的任何调用实际上都是对null.next的调用,这是一个废话。通过检查空状态来启动方法:
if(head == null){
head = new SlinkNode(item);
size = 1;
return;
}
请注意,head只是一个标准节点,它包含您的第一个项目。大小设置为1,您将从该方法返回,因为没有其他工作要做。
另请注意,代码末尾的size--会减小大小,而不会在添加新节点时递增大小。应该是++的大小。
答案 3 :(得分:1)
这是一个很好的问题。如果列表中没有元素,则head将为null值。当您尝试访问current.next
时,它实际上意味着null.next
。由于null值,您将收到错误。您可以查看null
并直接添加。
public void insertEnd(Object item){
if(head!=null)
{
SListNode current=head;
while(current.next!=null)
{
current=current.next;
}
current.next=new SListNode(item);
size++;
}
else
{
current=new SListNode(item);
}
}