2016-12-11 5 views
0

私は簡単なJavaの質問があります。次のコードに示すように:Javaの単一リンクリストをトラバースする

public static ListNode removeNthFromEnd(ListNode head, int n) { 

     ListNode start = new ListNode(0); 
     ListNode slow = start, fast = start; 
     slow.next = head; 

     //Move fast in front so that the gap between slow and fast becomes n 
     for(int i=1; i<=n+1; i++) { 
      fast = fast.next; 
     } 
     //Move fast to the end, maintaining the gap 
     while(fast != null) { 
      slow = slow.next; 
      fast = fast.next; 
     } 
     //Skip the desired node 
     slow.next = slow.next.next; 
     return start.next; 
    } 

開始、高速かつ低速の同じオブジェクトをアドレスします。なぜ私は「遅い=遅い。開始オブジェクトは変更されませんが、 "slow.next = slow.next.next;"開始オブジェクトを変更します。

+1

あなたの質問のタイトルは実際にあなたがやっていることには関係しません。あなたが各ノードを訪問しようとしていたという誤った仮定をしました。おそらくそれを改善できますか? – byxor

+0

これは、nullポインタの例外についても悲鳴を上げるようです。 **開始**ノードを作成します。これはおそらくそのリストにフォロワーがいないことを意味します。問題を尋ねるようにその音を反復する。 – GhostCat

+0

@GhostCatは、2つの行がダウンしていることを除いて 'slow.next = head; 'です。あなたの上の1行は' slow = fast = start'を持っていますので、 'slow.next = head'は'索引-1のノードと低速/高速がこの位置に設定されます '。 'for(int i = 1; i <= n + 1; i ++)'サイクルが 'null'に対してテストしないので、リストにN個の要素が含まれていれば、すべてがうまくいくでしょう。 –

答えて

2

slowはローカル変数なので、新しいインスタンスListNodeを参照するようにその値を変更しても、元のリストには影響しません。

slowはあなたのリストに属しListNodeを参照する場合は、新しいインスタンスを参照するためにslow.nextを変更すると、あなたのリストの状態を変更します。あなたは次のノードを変更するためにセッターを使用している場合

それは明確ことがありますslowはあなたのリストに属しListNodeを参照するのであれば

slow.setNext(slow.next.next); 

slow.next = slow.next.next; 

はに相当しますその状態を変更すると、あなたのリストの状態が変化しています。

関連する問題