2017-01-14 11 views
0

私は、データ構造に関連したアルゴリズムの解決に新しいですし、私は疑問に遭遇次のコードがわからないよ:LinkedListなぜここにダミーを作成する必要がありますか?

public ListNode swapPairs(ListNode head) { 
    ListNode dummy = new ListNode(0); 
    dummy.next = head; 

    head = dummy; 
    while (head.next != null && head.next.next != null) { 
     ListNode n1 = head.next, n2 = head.next.next; 

     head.next = n2; 
     n1.next = n2.next; 
     n2.next = n1;     
     head = n1; 
    } 
    return dummy.next; 
} 

私たちはここにダミーを作成しなければならないのはなぜ?

これについて私が助けてくれるなら、大きな助けになるでしょう。リンクされたリストに対して何らかの操作を実行する必要があるときも、同様の手順を実行しました。

+1

を? 'swapPairs()'が何をすべきかの定義はありますか?期待された振る舞いが何であるかを知らずに、なぜそれがどういう形で書かれたのか、あなたにはわかりません。 –

+0

こんにちは、これは質問です。それを見てください。ありがとう。リンクされたリストが与えられた場合、隣接する2つのノードごとにスワップし、そのヘッドを返します。たとえば、1-> 2-> 3-> 4と指定した場合は、リストを2-> 1-> 4-> 3に戻す必要があります。あなたのアルゴリズムは一定のスペースだけを使うべきです。リストの値を変更することはできません。ノード自体だけを変更することができます。 Java –

+1

ループ内のコードを簡単にします。それ以外の場合は、ノードを変更するたびに、それが頭であるかどうかを心配する必要があります。 – EJP

答えて

-2

ダミーノードを追加する必要はありません。実際、ダミーノードを先頭に追加してリンクリストの先頭を変更しています。あなたのコードはダミーノードなしで動作するはずです。

public void swapPairs(ListNode head) { 

    if(head!=null) { 
     while (head.next != null && head.next.next != null) { 
     ListNode n1 = head.next, n2 = head.next.next; 

     head.next = n2; 
     n1.next = n2.next; 
     n2.next = n1; 

     head = n1; 
     } 
    } 
} 
+0

こんにちは、お返事いただきありがとうございます。ノードを追加すると役に立つと思う状況を教えてください。ありがとう、あなたの助けに感謝します。 –

+0

OPのコードは、ダミーノードをヘッドとして追加せず、このコードは新しいヘッドを返しません。それはまたリストのほとんどを失うように見える。 – EJP

0

リンクされたリスト内の2つのノードを交換する場合は、それらのノード前のノードにnextポインタを変更する必要があります。

たとえば、あなたがリストA->B->Cを持っている、とあなたはBCを交換したい、あなたはそれらのノードの全てnextポインタを変更する必要があります。

あなたは最初つのノードを交換したい場合は、しかし、あなたは、リストの先頭にこれら二つのノードポインタでnextポインタを変更する必要があります。

あなたがしなければならないことは、リストの始めに入れ替えているかどうかによって決まります...しかし、あなたの関数の作成者は怠け者であり、2つ書く必要はありませんでした異なる種類のスワップコード。

氏Lazyプログラマは、したがって、彼が交換しなければならないすべてのものの前にダミーノードに詰まっていました。そうすれば、彼は最初に何かを交換する必要はなく、すべてのスワップに同じコードを使用することができます。彼は最後にこのノードを削除するので、害はありません。

ダミーノードを作成することは、Javaではそれほど高価ではありませんが、私はこのようにしませんでした。

私はこのような二つの方法出て記述します。この関数はどこから来たの

public ListNode swapPairs(ListNode head) { 

    if (head != null || head.next != null) { 

     //swap first 2 nodes 
     ListNode n1 = head; 
     ListNode n2 = n1.next; 

     head = n2; 
     n1.next = n2.next; 
     n2.next = n1;     
     ListNode pred = n1; 

     //swap remainder 
     while (pred.next != null && pred.next.next != null) { 
      n1 = pred.next; 
      n2 = n1.next; 

      pred.next = n2; 
      n1.next = n2.next; 
      n2.next = n1;     
      pred = n1; 
     } 
    } 
    return head; 
} 
+0

すべてのプログラマは怠惰でなければなりません。私はこれが良い解決策だと言います。 – EJP

+0

@EJPプログラマーは、怠け者であるものを慎重に選択して選択する必要があります。私のコードはそれほど長くはありませんし、理解するためにSOに質問する必要はなく、他のものがListNode内にあっても高速です。 –

関連する問題