公共类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不起作用?
答案 0 :(得分:1)
在下面的调用中,您实际上是在传递列表头节点的内存位置而不是实际的头对象:
addFront(list.head,8);
然后通过参考方法签名(即节点头)来保持存储器位置。
head - > List的头节点内存位置
然后在方法体内,您只需将引用重置为新的内存位置。 :
头 - >新节点内存位置。
请注意:list.head是一个非原始对象,在java中,非原始对象通过引用传递。
答案 1 :(得分:0)
因为Node head
是addFront()
的局部变量,指向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
。