通过引用传递的Java链接列表不起作用

时间:2019-04-24 18:05:29

标签: java linked-list

我正在编写一个函数来查找两个链表的交集。

我的第一个实现是这样的(advanceByK函数前进并且不返回值):

public ListNode getIntersectionNode(ListNode a, ListNode b) {

        int aLen=findLength(a);
        int bLen = findLength(b);

        if(aLen==0 || bLen==0) return null;

        ListNode aTemp = a, bTemp = b;

        if(aLen>bLen) {
            advanceByK(aTemp,aLen-bLen);
        } else if(bLen > aLen) {
            advanceByK(bTemp,bLen-aLen);
        }

        while((aTemp!=null) && (bTemp !=null)) {
            if(aTemp.equals(bTemp))return aTemp;

            aTemp = aTemp.next;
            bTemp = bTemp.next;
        }
        return null;
    }

    public void advanceByK(ListNode head, int k) {

        while(k>0) {
            if(head!=null) head=head.next;
            k--;
        }
    }

    public int findLength(ListNode head) {
        ListNode temp = head;
        int res =0;
        if(temp==null) return res;

        while(temp!=null) {
            res++;
            temp = temp.next;
        }

        return res;
    }

然后我改成了这个,就行了

    public ListNode advanceByK(ListNode head, int k) {

        while(k>0) {
            if(head!=null) head=head.next;
            k--;
        }
        return head;
    }

我在这里做错了什么?

我知道Java是通过引用传递的,它应该已经将头移到了advanceByK函数中

1 个答案:

答案 0 :(得分:1)

在第一个实现中,head是对特定ListNode对象的引用。如果要通过调用head上的方法来对其进行修改,它的行为将与您期望的通过引用传递的方式相同。

但是,您所做的却是这样:

head=head.next;

这不会修改head引用的对象中的任何状态。相反,它将更改本地ListNode指向的headListNode指向的原始head保持不变。