2017-05-19 12 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は常に参照のコピーを渡します。あなたがそうするとき、

curr = head; 

同じオブジェクトにcurrと頭のポイント。あなたがそうするとき、

curr.next = lst; 

curr.nextとhead.nextの両方ともnullを指し始めます(nullの場合は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;設定したとき、あなたはheadへの参照としてcurrを設定しているためであると考えています。したがって、head = head.nextを設定すると、headがヌルに設定され、ループが終了します。

0
curr = head; 

上記ラインはcurr変数にheadオブジェクトの参照を格納します。 lstが最初nullcurrそのまま

curr.next = lst; 

さて、これはhead.next = nullを行うheadオブジェクトの参照を保持しています。

lst = curr; 

あなたが実際にheadあるcurrを参照するための変数lstを作っています。先に説明したように

head = head.next; 

は今 head.nextので、ループが終了し nullです。 currheadを指しています。元のリストの先頭だけを含む元のリストを変更しました。

1

他の回答は問題を説明してくれました。問題を解決するためには、ループ内で必要なのは次のとおりです:

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

これはリストをトラバースしてポインタを逆転させます。

これはあなたが探しているものですか?

だから、完全なコード:javaの少しで参照し、オブジェクトに関する

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; 
    } 
}