2017-12-28 71 views
-1

私は理解するのに苦労しているコードを持っています。コードスニペット自体は、二重にリンクされたリストのコンストラクタです。しかし最後の行には次のように書かれています:(head = head.next).previous = null;これは、おそらく、配列aからノードを追加するために使用される一時的なノードを削除します。しかし、どのように機能するのですか?誰かがそれを明確かつ別々の行に分割することができれば、それは非常に役に立ちます。Javaで構文が混乱しています

// standard constructor 
public DoublyLinkedList() { 
    head = tail = null; 
    numElements = 0; 
    changes = 0; 
} 

// constructor 
public DoublyLinkedList(T[] a) { 
    this(); // call the standard constructor 

    Objects.requireNonNull(a, "a is null!"); 

    head = tail = new Node<>(null); // a temporary node 

    for (T value : a) { 
     if (value != null) { 
      tail = tail.next = new Node<>(value, tail, null); // new node at the back 
      numElements++; 
     } 
    } 

    // remove the temporary node 
    if (numElements == 0) head = tail = null; 
    else (head = head.next).previous = null; // the problematic bit 
} 
+0

これは論理質問か構文質問ですか?正確に何を理解していないのですか? – shmosel

+0

@shmosel私はそれが文法の問題であると思う、コメントのおかげで。 –

答えて

0

それはこのように書き:

if (numElements == 0) { 
    head = null; 
    tail = null; 
} 
else { 
    head = head.next; 
    head.previous = null; // the problematic bit 
} 

人々は、元の道を書くべきではありません、それはあなただけの発見として、混乱のコードを作る はここでコンストラクタです。

0
head = head.next; 
head.previous = null; 
+2

このコードスニペットは解決策になるかもしれませんが、説明を含めて本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はコード提案の理由を知らないかもしれません –

0

私はあなたのためにそれを試してみましょう。

else (head = head.next).previous = null; // the problematic bit 

括弧の内部表現は他のように、上記のコードの一部は、本質的に次のようになったことを意味し、最初に評価されています。私はあなたが理解は、以下れる難しさを持っているコードの一部があると仮定しています私の前の人はすでに言及しています。

head = head.next; // move onto the next node 
head.previous = null; 

上記のロジックの理解に問題がある場合は、次のコードを実行してみてください。 4 + 2は、除算操作の前に最初に評価されます。

System.out.println((4 + 2)/2); 
0

初めて.nextを使用するには一時ノードが必要です。それは頭の上に置かれている。それがもはや必要でなくなったら、それは頭から取り除かれます。

.previousがループ内に設定されていないため、コード内の問題は機能しません。