我正在研究链接列表,我在理解Java中的引用和指针时遇到了一些问题(还有一些我无法在互联网上找到答案的问题.)也就是说,我有一个LinkedList使用类的Node类这个:
public class LinkedList {
public Node head;
public LinkedList(int data) {
head = new Node(data);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Node类:
public class Node {
public int data;
public Node next;
public Node(int data2) {
data = data2;
}
}
Run Code Online (Sandbox Code Playgroud)
我也有方法toStringLL()里面LinkedList看起来像:
public void toStringLL() {
LinkedList l=this;
while(l.head.next != null) {
System.out.print(l.head.data+"->");
l.head = l.head.next;
}
System.out.print(l.head.data);
System.out.println("");
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这会toStringLL()改变我的链表清单,当我用它迭代时l.head=l.head.next?我的头脑不应该保持不变吗?我想当我写作时LinkedList l=this,我可以自由地迭代l,而不会影响this(或者我错了?)现在当我使用Node n=this.head而不是LinkedList l=this,它有效,但我很难弄清楚为什么这样有效以前没有..有人可以向我解释这两者之间的区别吗?
我不明白为什么这个toStringLL()改变了我的链表头,当我用l.head = l.head.next迭代它时?我的头部不应该保持不变吗?
当你完成作业
LinkedList l = this;
Run Code Online (Sandbox Code Playgroud)
你没有创建一个新LinkedList对象.您只是定义对现有LinkedList对象的引用.
因此,l.head = l.head.next完全一样this.head = this.head.next.两者都会更改原始列表.
另一方面,当你写作
Node n = this.head
Run Code Online (Sandbox Code Playgroud)
你没有改变你的名单的头部.您正在声明一个最初引用headList的变量,但是当您更改该变量以引用列表中的其他节点时,headlist(this.head)的变量保持不变.