题目:4、链表(如图7-3所示)的每个结点定义如下:
     Node {
        int data;
        Node next;
     }
    创建一个初始为10个结点的单向链表,结点数据用随机函数产生。
(1) 输出该链表:
(2)分别在首尾增加一个数据为100的结点,输出链表。    请前辈们指点一下标红处,为什么在方法里面将p赋给header就不行,在外面就可以?
import java.util.Random;public class Linklist {
public static void main(String[] args) {
Random r=new Random();
Node header=new Node(r.nextInt(100)+1);
struct(header);
print(header);
System.out.println("");
Node p=new Node(r.nextInt(100)+1);
addFront(header,p);//头部添加
header=p;//外部可以赋
print(header);
System.out.println("");
Node d=new Node(r.nextInt(100)+1);
addLast(header,d);//尾部添加
print(header);

}
//构造链表
public static void struct(Node head){
Random r=new Random();
for(int i=0;i<10;i++){
Node p=new Node(r.nextInt(100)+1);
head.next=p;
head=p;
}
}
//输出链表
public static void print(Node head){
while(head.next!=null){
System.out.print(head.data+" ");
head=head.next;
}
}
//头部添加
public static void addFront(Node head,Node p){
p.next=head;
head=p;//不能把P赋给head??
}
//尾部添加
public static void addLast(Node head,Node p){
while(head.next!=null)
head=head.next;
head.next=p;
}
}

解决方案 »

  1.   

    这是一个老生常谈的问题了。当你调用addFront(Node head,Node p)的时候,传递给方法中的形参head和p是引用地址的值的副本。而形参head和p是属于addFront方法的变量,和main方法中的head和p没有关系,只是指向了同样的内存地址而已。当你在方法中执行head=p,不过是把addFront方法的变量p的引用地址传给了方法中的变量head,而和main方法中的变量毫无关系,所以main方法中的变量根本不会有任何改变。你可能会问,p.next=head;不就可以改变值吗?那是因为p.next所调用的是这个引用类型变量所指向的内存地址的对象的成员变量,而无论是addFront方法的p和main方法中的p所指向的都是同一个内存地址,这个内存地址中的对象发生改变了,那么两个变量都会有影响,因为他们都是指向这个实际对象的。ps:你的代码排版不好看,可以试试CSDN提供的排版工具。