今天在做一道題的時候,發現鏈表的參數引用並不簡單,在這裏記錄一下。
這道題我用到了反轉鏈表的函數,原本是想試試看直接在原鏈表上修改結構,結果發現在函數中修改完結構,函數外的鏈表與函數裏的鏈表已經不是指同一個對象了。具體代碼如下:
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還是指向原來的首節點對象(也就是新鏈表的最後一個元素啦,因爲已經反轉了),而不是新的首節點。
總結來說就是:對象作爲參數傳遞的時候,變量名並不是與這個對象綁定的,想琢磨透對象在其中的變化,得抓住對應的對象引用值纔行。