链表将元素添加到列表的末尾

时间:2014-05-02 12:21:06

标签: java algorithm data-structures linked-list

在链接列表中实现一个在列表末尾插入项目的方法时,这就是我想到的代码,

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); enter image description here

指向新创建的节点

我的第二个问题是为什么当列表为空时我必须考虑一个单独的案例?我得到一个空指针异常错误。

有人可以用图表来解释吗

4 个答案:

答案 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--会减小大小,而不会在添加新节点时递增大小。应该是++的大小。

Hope this helps visualise it.

答案 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);
}
}