在Java中插入链表失败

时间:2016-08-31 21:53:46

标签: java linked-list

我正在尝试将新元素插入用户创建的链接列表的尾部。解决方案1失败,但解决方案2工作,我无法弄清楚原因:

  class Node {
     int data;
     Node next;
  }

解决方案1:

Node Insert(Node head,int data) {
        if(head == null) {
            head = new Node();
            head.data = data;
            head.next = null;
        } else {
            Node elem = head;
            while(elem != null) {
                elem = elem.next;
            }
            elem = new Node();
            elem.data = data;
            elem.next = null;
        }
        return head;
    }

解决方案2:

Node Insert(Node head,int data) {
        if(head == null) {
            head = new Node();
            head.data = data;
            head.next = null;
        } else {
            Node elem = head;
            while(elem.next != null) {
                elem = elem.next;
            }
            elem.next = new Node();
            elem = elem.next;
            elem.data = data;
            elem.next = null;
        }
            return head;
    }

3 个答案:

答案 0 :(得分:2)

在解决方案1中,您将导航列表,直到您点击空,然后您创建一个新的Node,该列表中的任何内容都没有引用它:

Node elem = head;
while(elem != null) {
    elem = elem.next;
}
elem = new Node();

此最终作业不会更改列表中的任何元素。因此,您的新Node未加入列表。

在解决方案2中,当您到达最后一个现有Node(其next引用为空)时,您将新Node添加为其next参考:

Node elem = head;
while(elem.next != null) {
    elem = elem.next;
}
elem.next = new Node(); /* This adds the node after the last node */

这是有效的,因为新的Node被列表中的现有元素引用。

答案 1 :(得分:0)

当while循环结束时,您最终会进入链表的最后一个元素。第一个解决方案只是覆盖最后一个元素,而是需要转到下一个elem(elem.next),然后添加数据,这是你在第二个解决方案中所做的

答案 2 :(得分:-1)

似乎在您的第一个解决方案中,您通过迭代遍历列表中的最后一个元素。虽然最后一个元素是变量" elem"你创建一个新元素分配给同一个" elem"导致你丢失最后一个元素的变量。