私が理解しているように、それはリスト内の最初/最後の ( Nil
) 要素に関連しています (リストが空の場合、Nil
最初と最後の要素が同時に存在します)。
LinkedList (まだ) は「プリミティブ チャーム」戦略に従います。したがって、Nil
{Nil, newElement}. (結局Nil
最後の要素にする必要があります)
もちろん、if
リストが空であることを確認addingList
してから、最初とNil
最後に配置することもできます。しかし、これは「賢すぎる」と思います。
しかし、とにかく、次のappend()
ような「期待する」結果を返します。
val addingList = new LinkedList[String]("a", "b")
val result = emptyList append addingList
result = {"a", "b"}.
この場合、「addingList」自体を返しますが、初期リストは変更しません。
newElement をnext
ref に割り当てようとすると、次のようになります。
emptyList.next = LinkedList("whatever")
その結果、emtyList は次のように変更されます。
LinkedList(null, whatever)
つまり、最初の要素を null として作成しますnext()
。これは、新しい/次の要素の割り当てを使用しているためです。したがって、null である最初の要素には、追加した新しい要素 ( addingElelement
) への次の参照があるため、Nil を最後に移動します。
なぜなら
「「emptyList」は「ヘッド」リンクでもあります」
この場合の head は head ですがNil
、Nill
next を持つことはできないため、 new への next() 参照を使用して新しい最初の要素 (null 値を持つ) を作成する必要がありますaddingElelement
。
個人的には、「あまりにも原始的」であり、「エレガント」ではないと思います。しかし、それは依存していると思います。
タスク指向のストーリー:
私の最初の仕事のために(なぜ私はこの「奇妙な」リストの振る舞いについて考え始めたのですか[それは可変ですが])-私はDictionary
それを保持するために呼び出されるクラス/オブジェクトに可変リストを使用したかっWords
たです(デフォルトでは辞書には単語がありません)。ddWord(wod:String)
そして、新しい単語を追加するための のようなメソッドが必要です。今のところ、私の実装は変更されます (私はこれを使用するつもりはありませんLinkedList
が、むしろを使用しますMutableList
。以前のものよりも変更可能であるようです):
object Dictionary {
val words = new mutable.MutableList[Word]();
def addWord(word: Word): Unit = {
words += word;
}
}
しかし、可能な実装は次のようになります。
object Dictionary {
var words = new mutable.LinkedList[Word]();
def addWord(word: Word): Unit = {
if (words.isEmpty) {
words = words append( mutable.LinkedList[Word](word) ) // rely on append result
} else {
words append( mutable.LinkedList[Word](word) )
}
}
}
しかし、var
代わりにを使用する必要があり、すべての新しいWordを にval
変換する必要があり、ロジックがより複雑になりました。LinkedList