Java關於鏈表的函數傳參坑

今天在做一道題的時候,發現鏈表的參數引用並不簡單,在這裏記錄一下。

這道題我用到了反轉鏈表的函數,原本是想試試看直接在原鏈表上修改結構,結果發現在函數中修改完結構,函數外的鏈表與函數裏的鏈表已經不是指同一個對象了。具體代碼如下:

class Solution3 {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        reverseListNode(listNode);
        while (listNode != null) {
            arrayList.add(listNode.val);
            listNode = listNode.next;
        }
        return arrayList;//執行出來的結果只剩最後一個元素
    }

    private void reverseListNode(ListNode listNode) {
        ListNode prev = null;
        while (listNode != null) {
            ListNode nextTemp = listNode.next;
            listNode.next = prev;
            prev = listNode;
            listNode = nextTemp;
        }
        listNode = prev;//到這裏listNode就是完全反轉過後的鏈表了,但是最後執行出來的結果發現
    }
}

我使用debug查看了一下,發現進去之前listNode是@831,
進入前
進去後一直變化,
進入後
跳出函數外後又變回了@831.
出來後
後來想了一下,原因應該是這樣的:

1.首先這個鏈表每個節點都是一個對象;

2.鏈表的首節點作爲參數進去時指向的是首節點對象,而在函數中因爲不斷的賦值,listNode所指定的對象不斷在變化;

3.函數處理完後,listNode還是指向原來的首節點對象(也就是新鏈表的最後一個元素啦,因爲已經反轉了),而不是新的首節點。

總結來說就是:對象作爲參數傳遞的時候,變量名並不是與這個對象綁定的,想琢磨透對象在其中的變化,得抓住對應的對象引用值纔行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章