2017-05-19 56 views
0

我在做這個leetcode問題,我不明白爲什麼這個解決方案不起作用。它似乎只是返回頭元素。由於反向鏈接列表Java內存

/** 
* Definition for singly-linked list. 
* public class ListNode { 
*  int val; 
*  ListNode next; 
*  ListNode(int x) { val = x; } 
* } 
*/ 
public class Solution { 
    public ListNode reverseList(ListNode head) {  
     ListNode curr = null; 
     ListNode lst = null; 
     while (head != null) 
     { 
      curr = head; 
      curr.next = lst; 
      lst = curr; 
      head = head.next; 
     } 

     return curr; 

    } 
} 

回答

0

閱讀有關Java中一點參考和對象。 Java總是傳遞參考副本。所以當你這樣做時,

curr = head; 

curr和head指向同一個對象。當你這樣做,

curr.next = lst; 

兩個curr.next以及head.next都開始指向空(如空LST)。 下次你休息一下。

試試這個解決方案,它會工作。

public class Solution { 
    public ListNode reverseList(ListNode head) {  
     ListNode nxt = null; 
     ListNode lst = null; 
     while (head != null) 
     { 
      nxt = head.next; 
      head.next = lst; 
      lst = head; 
      head = nxt; 
     } 
     return lst; 
    } 
} 
0

我想這是因爲當你設置curr = head;,要設置currhead參考。所以當你設置head = head.next它將head設置爲空並結束循環。

0
curr = head; 

上面一行中curr變量存儲head對象的參考。

curr.next = lst; 

現在這使得head.next = null作爲lst最初nullcurr持有head對象的引用。

lst = curr; 

你正在變lst引用curr這實際上是head

head = head.next; 

現在如前所述head.nextnull如此循環終止。 curr指向head。您已經修改了僅包含原始列表頭部的原始列表。

1

其他答案已經很好地解釋了這個問題。要解決這個問題,我想你在你的循環需要的是這樣的:

lst = curr; 
curr = head; 
head = head.next; 
curr.next = lst; 

這將遍歷列表和反向指針。

這是你在找什麼?

所以全碼:

public class Solution { 
    public ListNode reverseList(ListNode head) {  
     ListNode curr = null; 
     ListNode lst = null; 
     while (head != null) 
     { 
      lst = curr; 
      curr = head; 
      head = head.next; 
      curr.next = lst; 
     } 
     return curr; 
    } 
}