TFPList как раз использует механизм связаных цепочек, элемент указывает на следующий элемент, против TList, где используется массив.
скорость вставки в любом месте не должна быть разной.
Откуда вы взяли этот бред?
Откройте исходники и посмотрите. TFPList использует внутри массив PPointerList = ^TPointerList, который обычный статический массив TPointerList = array[0..MaxListSize - 1] of Pointer.
При добавлении и удалении элементов данный массив перераспределяется через ReallocMem.
TList внутри реализован точно также, поскольку внутри себя содержит поле FList: TFPList, в котором хранятся указатели на элементы списка. По сути TList есть обёртка над TFPList, которая добавляет интерфейс IFPObserved и набор функций для контроля за изменениями в списке.
Что касается вставки элементов, то отдельными элементами никто ничего не перемещает. Всё делается за одну операцию:
System.Move(Flist^[Index], Flist^[Index+1], (FCount - Index) * SizeOf(Pointer));
На большинстве процессоров это будет одна процессорная команда, которая перемещает в оперативной памяти набор байт с одного адреса в другой. А с учётом быстродействия современных процессоров вы будете замечать какие-либо ощутимые задержки только при размерах списков в десятки тысяч элементов и больше.
Опять же, что TFPList, что TList, при вставке элемента перемещают в памяти только указатели на элементы, а не сами элементы, так что с использованием на практике с ними никогда проблем не возникало. Не надо выдумывать.
Что касается связанных списков, то тут я полностью поддерживают Zub'a. Может быть вставка элемента и будет происходить "за фиксированное время", но вот доступ к элементу по его номеру (индексу) будет очень долгой. Причём тем больше, чем больше список и чем больший номер (индекс) элемента, к которому вы хотите получить доступ. В связи с чем возникает резонный вопрос, что вы делаете чаще, вставляете элементы внутрь списка или получаете к ним доступ по номеру (индексу)?