void结果与特定结果之间的差异

时间:2017-03-26 09:37:45

标签: java linked-list insert void

我有点问题。以下代码在已排序的LinkedList中插入给定元素。如果我将此方法作为void方法运行,结果是错误的。例如,之前的列表是1,2,3。如果我以2作为插入启动方法,它可以正常工作。但如果我插入一个小于1或大于3的数字,它就不起作用。

如果我改变方法以返回新链接列表的头部,它可以完美地工作。

这里有什么不对吗?

在这里你可以看到两个代码:

static void insertIter (simplyLinkedList head, int insert, Comparator cmp){

    if (head == null) return;

    simplyLinkedList last = null;
    simplyLinkedList actual = head;
    simplyLinkedList add = new simplyLinkedList(insert);

    while (actual != null){

        if (cmp.compareInt(insert, actual.key) == -1 || cmp.compareInt(insert, actual.key ) == 0){

            add.next = actual;

            if (last == null){

                head = add;

            }
            else {

                last.next = add;

            }
            return;
        }   
        last = actual;
        actual = actual.next;
    }
    if (actual == null){

        last.next = add;
        add.next = null;    
    }

    return;
}




static simplyLinkedList insertIter (simplyLinkedList head, int insert, Comparator cmp){

    if (head == null) return null;

    simplyLinkedList last = null;
    simplyLinkedList actual = head;
    simplyLinkedList add = new simplyLinkedList(insert);

    while (actual != null){

        if (cmp.compareInt(insert, actual.key) == -1 || cmp.compareInt(insert, actual.key ) == 0){

            add.next = actual;

            if (last == null){

                head = add;

            }
            else {

                last.next = add;

            }
            return head;
        }   
        last = actual;
        actual = actual.next;
    }
    if (actual == null){

        last.next = add;
        add.next = null;    
    }

    return head;
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

在您的代码中,您更改了head

的值
if (last == null){
    head = add;
}

这会改变参数的值。它对调用代码的版本没有影响。例如,如果调用代码是

insertIter(foo, 1, someComparator);

... head中更改insertIterfoo的值没有任何影响; foo仍包含旧值。

由于您可能需要更改head,因此您需要将其返回(如您所发现的),并执行此操作:

foo = insertIter(foo, 1, someComparator);

请记住,变量包含值,它是传递给方法的值,而不是变量。与对象相关的值称为对象引用。它类似于JVM用于在内存中定位对象的数字。上面foo可能包含Ref55465(我们从未看到这些实际值),即使您将head中的值从Ref55465更改为Ref66548,{{ 1}}仍然包含foo