Ответ 1
Я бы сказал, что причина кроется в сложности - класс связанного списка позволяет удерживать ссылку на node в середине списка и использовать insert
или update
в этом node, вместо этого прохождение главы списка.
[] --> [] --> ... --> [] --> ... --> [] --|
^ ^
head myReference
В приложении, где я точно знаю, где будет происходить изменение в какой-либо последовательности (myReference
выше), гораздо дешевле изменить это местоположение, чем копировать все до этого местоположения, как это было бы в случае с immutable.List
( т.е. я просто вставляю новый node после myReference
).
myNewNode
v
[] --> [] --> ... --> [] --> [] ---> ... --> [] --|
^ ^
head myReference
Пример такого приложения - L-system, где вы расширяете части строки. Намного дешевле вставлять новые узлы на место, чем копировать всю строку каждый раз, когда ее нужно развернуть.
Еще одна причина - полнота - поскольку DoubleLinkedList
и LinkedListLike
разделяют много общей инфраструктуры, предоставление дополнительного класса LinkedList
объясняется низкой стоимостью стандартного размера библиотеки.