0

我是java新手。这个问题可能不是那么清楚。让我用代码解释一下。下面的代码是一个打印出链表中值的函数。函数的第一行创建一个引用,指向 HeadNode 引用所指向的同一个对象。因此,对 currentNode 的任何更改都会影响 HeadNode 指向的对象。现在,在 while 循环中,我正在更改 currentNode,但我观察到在退出函数后linkedList 没有更改。为什么?

static void PrintLinkedList(ListNode HeadNode)
    {
        ListNode currentNode = HeadNode;
        while(currentNode != null)
        {
            System.out.println(currentNode.getData());
            currentNode = currentNode.getNext();
        }
    }

更新:

我提出这个问题的原因是,当我实现一个反转链表的函数时,我的 tempNode 在执行以下代码后变为空:

static ListNode ReverseLinkedList(ListNode headNode)
    {
        ListNode headNodeTemp = headNode;
        headNodeTemp.setNext(null);
        ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why??
        ListNode currentNode = headNodeTemp;
        while(tempNode != null)
        {...
4

3 回答 3

2

因此,对 currentNode 的任何更改都会影响 HeadNode 指向的对象。

不,currentNode是对对象的引用HeadNode也指。你永远不会改变那个对象,你改变的只是currentNode所指的。

currentNode = currentNode.getNext();

指向下一个对象,它currentNode不会更改任何对象。

要更改对象,您需要调用方法或设置属性,

currentNode.mutate();
currentNode.property = 17;

将更改指向的对象,并且当通过 查询对象时这些更改将是可见的HeadNode

currentNode = currentNode.getNext();

只是currentNode指向另一个对象。

static ListNode ReverseLinkedList(ListNode headNode)
{
    ListNode headNodeTemp = headNode;
    headNodeTemp.setNext(null);

在这里,我们调用一个改变指向对象的方法。按照名称,它将next字段设置为null. 而对象所headNodeTemp指向的就是对象所headNode指向的。

    ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why??
    ListNode currentNode = headNodeTemp;
    while(tempNode != null)
    {...

你应该移动

ListNode tempNode = headNode.getNext();

线上方的setNext(null)线。

static ListNode ReverseLinkedList(ListNode headNode)
{
    ListNode headNodeTemp = headNode;
    ListNode tempNode = headNode.getNext();
    headNodeTemp.setNext(null);
    ListNode currentNode = headNodeTemp;
    while(tempNode != null)
    {...
于 2012-12-11T01:16:25.550 回答
0

您混淆了对象和引用。

currentNode = x不改变currentNode指向的对象。相反,它将currentNode 变量更改为指向不同的对象。

这不会影响碰巧指向旧对象的任何其他字段或变量。

于 2012-12-11T01:16:33.570 回答
0

与其他职位一致。Java 中的所有参数都是按值传递的 - 演示:

public static void main(String[] args) {

    List a = new ArrayList();
    a.add("Fred");

    changeA(a);
    // contents of a is "Fred" not "Barney" (change to 'a' not reflected back here)
    // because all arguments are Pass-By-Value

    addToA(a);
    // contents of a is "Fred" AND "Barney"

    int b = 10;    

    changeB(b);
    // b = 10 (not 20)
}

static void changeA(List a) {
    a = new ArrayList(); // a is now a different object
    a.add("Barney");
}

static void addToA(List a) {
    a.add("Barney");
}

static void changeB(int b) {
    b = 20;
}
于 2012-12-11T01:37:13.287 回答