如何理解浅拷贝?单链表中temp修改未改变head的问题咨询
Java单链表引用操作疑问解答
你写的尾插代码如下(已补全缺失的闭合括号,符合语法规范):
public class noorderedlist { node head; public void afadd(int element){ node newnode=new node(element); if(head==null){ head=newnode; return; } node temp=head; while(temp.next != null){ temp = temp.next; } temp.next = newnode; } public void print(){ node currentnode=head; while(currentnode!=null){ System.out.print(currentnode.element); currentnode=currentnode.next; } } } public class node { node next=null; int element; public node(int element){ this.element=element; } }
疑问解答
首先明确核心误区:你的问题和浅拷贝没有任何关系,本质是你混淆了Java中修改引用变量本身的指向和修改引用指向的对象的内部属性两种操作的区别。
为什么修改temp的时候会改变head?
你感知到的“修改temp改变head”,实际是执行temp.next = newnode这一步的效果:
- 当你执行
node temp = head时,temp和head是两个独立的栈引用变量,但它们存储的内存地址完全相同,指向堆内存里的同一个头结点对象。 temp.next = newnode是修改temp指向的对象的内部next属性,因为head和temp指向同一个对象,所以通过head访问该对象时,自然能看到属性修改的结果。
为什么执行temp=temp.next时head不会变化?
temp=temp.next属于修改temp引用变量本身的存储值,也就是把temp存的内存地址改成了下一个节点的地址,这个操作只改变temp本身的指向,和head这个引用变量没有任何关联,head存储的还是原来头结点的内存地址,所以不会发生变化。
通俗类比
你可以把引用变量理解为钥匙,对象理解为房间:
- head是大门钥匙,
node temp = head相当于配了一把和head一模一样的钥匙temp,两把钥匙都能开大门(头结点)。 - 你用temp钥匙打开大门,把里面的家具换了(修改temp指向对象的next属性),用head钥匙打开大门时当然能看到新家具。
- 你现在把temp钥匙改造成能开第二个房间的钥匙(执行
temp=temp.next),大门钥匙head不会有任何变化,依然能打开原来的大门。
代码执行流程示例
假设当前链表已有节点1→2→3,head指向1节点:
node temp = head:temp也指向1节点- 判断temp.next不为空,执行
temp = temp.next:temp指向2节点,head仍指向1节点 - 判断temp.next不为空,执行
temp = temp.next:temp指向3节点,head仍指向1节点 - 循环结束,执行
temp.next = newnode:修改3节点的next属性指向新节点,链表变为1→2→3→新节点,head始终指向1节点,因此print方法遍历结果正常。
内容的提问来源于stack exchange,提问作者tim
相关产品推荐
相关产品推荐

