Java中LinkedList中的指针

slo*_*lll 1 java linked-list

我正在研究链接列表,我在理解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,它有效,但我很难弄清楚为什么这样有效以前没有..有人可以向我解释这两者之间的区别吗?

Era*_*ran 5

我不明白为什么这个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)的变量保持不变.