添加新节点添加LinkedList的开头并在LinkedList的末尾添加

时间:2017-09-23 19:36:55

标签: java linked-list

公共类InsertithNode {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    LinkedList list=new LinkedList();
    list.head=new Node(2);
    list.head.next=new Node(3);


    addFront(list.head,8);

    System.out.println(list);

    addEnd(list.head,11);

    System.out.println(list);
     addEnd(list.head,15);

    System.out.println(list);

  }
public static void addFront(Node head,int value)
{
   Node newHead=new Node(value);
   newHead.next=head;
   head=newHead;

}

 public static void addEnd(Node head,int value) {

     Node newHead=new Node(value);
     Node ref=head;
     Node last=ref;

     while(ref!=null) {
         last=ref;
         ref=ref.next;
     }
     last.next=newHead;


 }

}

您好, 代码高于LinkedList add head的实现并添加last.However,当我运行代码时,我可以添加新节点作为Linked List上的最后一个节点,但我无法添加新节点到乞讨链接列表。

当我运行此代码时,输​​出为:

 head 2 --> 3 -->  null

 head 2 --> 3 --> 11 -->  null

 head 2 --> 3 --> 11 --> 15 -->  null

AddEnd方法有效,但为什么AddFront不起作用?

2 个答案:

答案 0 :(得分:1)

在下面的调用中,您实际上是在传递列表头节点的内存位置而不是实际的头对象:

addFront(list.head,8);

然后通过参考方法签名(即节点头)来保持存储器位置。

head - > List的头节点内存位置

然后在方法体内,您只需将引用重置为新的内存位置。 :

头 - >新节点内存位置。

请注意:list.head是一个非原始对象,在java中,非原始对象通过引用传递。

答案 1 :(得分:0)

因为Node headaddFront()的局部变量,指向list.head。执行head=newHead时,您只需将本地变量指向刚刚创建的新Node即可。 main()中的列表完全不受影响。

使用AddEnd,您无需修改​​列表的第一个元素,因此您无需发送列表。您也不要修改主列表,而只修改最后一个元素,这对于该方法来说就足够了。

您需要将列表发送到方法,以便它可以访问其head属性。

我使用的是C#,而不是Java,但我猜这应该可行:

    ...
    addFront(list, 8);
    ...
}

public static void addFront(LinkedList list,int value)
{
   Node newHead=new Node(value);
   newHead.next=list.head;
   list.head=newHead;
}

此处list也是一个局部变量,但它指向主列表,因此list.head是相同的内存位置,任何修改都会影响主list.head。如果您再次发生list = something,它将不会影响您的主列表,只会影响您的本地变量。

顺便说一下,尝试使用适当的变量名,这样代码就不会混淆。在addEnd中,您的变量不应命名为newHead