私が理解しているように、それはリスト内の最初/最後の ( 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 をnextref に割り当てようとすると、次のようになります。
emptyList.next = LinkedList("whatever")
その結果、emtyList は次のように変更されます。
LinkedList(null, whatever)
つまり、最初の要素を null として作成しますnext()。これは、新しい/次の要素の割り当てを使用しているためです。したがって、null である最初の要素には、追加した新しい要素 ( addingElelement) への次の参照があるため、Nil を最後に移動します。
なぜなら
「「emptyList」は「ヘッド」リンクでもあります」
この場合の head は head ですがNil、Nillnext を持つことはできないため、 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