2017-08-07 2 views
0

私は現在Coding Interview Problem(2.4)をクラッキングしていますが、xより小さいすべてのノードがx以上のすべてのノードの前に来るように、値xの周りのリンクリストを分割することになっています。しかし、私は本当に一時変数 "next"が必要で、どうしてnode.nextがその下にヌルになっているのか、本当に混乱しています。 whileループの最後でnode = node.nextだけを実行できないのはなぜですか?リンクされたリストを反復するためにnode = node.nextだけを実行することはできないのですか?

前後の2つのリンクされたリストを作成し、正しい値が各リストに入れられたら、それらを一緒にマージします。私は、whileループの最後にノード= node.nextを行うことができないのはなぜ

public static Node partition(Node node, int x) { 
    Node beforeStart = null; 
    Node beforeEnd = null; 
    Node afterStart = null; 
    Node afterEnd = null; 

    /* Partition list */ 
    while (node != null) { 
     Node next = node.next; 
     node.next = null; 
     if (node.data < x) { 
      if (beforeStart == null) { 
       beforeStart = node; 
       beforeEnd = beforeStart; 
      } else { 
       beforeEnd.next = node; 
       beforeEnd = beforeEnd.next; 
      } 
     } else { 
      if (afterStart == null) { 
       afterStart = node; 
       afterEnd = afterStart; 
      } else { 
       afterEnd.next = node; 
       afterEnd = afterEnd.next; 
      } 
     } 
     node = next;  
    } 

    /* Merge before list and after list */ 
    if (beforeStart == null) { 
     return afterStart; 
    } 

    beforeEnd.next = afterStart; 
    return beforeStart; 
} 
+1

あなたがしていたことがすべてリストを反復していたら、node = node.nextは問題ありません。あなたは反復だけではありません。 – user2357112

答えて

1

このようにすることができます。パーティションを実行した後、リストごとに、最後のノードの次のポインタをNULLに設定する必要があります。これは2行のコードをとるだけです。

例のコードでは、パーティション処理中に各リストを終了するためにnext = node.nextおよびnode.next = NULLを使用していますが、この場合は不要です。処理が行われます。

+0

ああ!ご説明ありがとうございます! –

0

質問のループは、元のリストの先頭からノードを削除し、元のリストが空になるまで、前のリストまたは後のリストに追加します。次に、前後のリストを連結します。

説明が分かりやすく分かりやすいです。

それは一時的なnextまたはすべての反復でnode.nextをゼロにすることなく行うことができますが、その後、上記の説明はもはや適用されないだろう - ノードは、すべての反復で元のリストから削除されない、リストの前およびリストの後に適切なノードのみを含むわけではありません。あなたが実行する操作は「追加」ではなく、ノードはしばらくの間複数のリストに表示されることさえあります。

あなたのアルゴリズムは突然、説明し理解するのがずっと難しくなります。それはソフトウェア開発では悪いことであり、コーディングの面接では悪いことです。

+0

ありがとうございました! –

関連する問題