参考解释Java中的链表数据结构
我知道java是按值传递的。对于链表数据结构,方法size()和size1()之间有什么区别?我认为有相同的原因,因为size1()中的头部和下一个参考点指向同一个东西。但结果是不同的
public class IntList {
int item;
IntList next;
public IntList(int item, IntList next){
this.item = item;
this.next = next;
}
public int size(){
int size = 1;
while (next !=null){
size++;
next = next.next;
}
return size;
}
public int size1(){
int size = 1;
IntList head = next;
while (head != null){
size++;
head = head.next;
}
return size;
}
public static void main(String[] args) {
IntList L = new IntList(1,null);
L = new IntList(2,L);
L = new IntList(3,L);
L = new IntList(10,L);
L = new IntList(20,L);
System.out.println(L.size());
}
}
我对java中的引用方式感到困惑
# 1 楼答案
这是一个涉及范围的问题。在size1()中,您正在创建一个名为head的局部变量。调用size1()时,它会创建一个引用变量,该变量将在调用结束时销毁。这意味着,无论调用size1()多少次,它都会为您提供正确的大小
但是,当您在size()中使用字段“next”时,它会遍历每个变量,直到结束。然而,一旦它到达那里,它就不会被销毁,因为它的作用域就是对象。这意味着下一次调用size()以及所有后续调用(如果没有更改),它将始终返回1
# 2 楼答案
它们在逻辑上是相同的,但是
size()
实际上是将next
指向最后一个节点,因此下一个大小检查将返回1size1()
使用局部变量遍历列表,因此对象状态不受影响