>>2,3
This assumes that allocation for a node of a linked list is a constant time operation, which many times it is not, as is the case when you
malloc each node. There's a fair amount of allocation overhead.
With dynamic arrays, you can allocate the array ahead of time to meet your capacity needs, or increase the dynamic array by a fixed factor when needed, thus amortizing the allocation overhead.
Furthermore, dynamic arrays have much better cache locality than linked lists, and this alone can result in much faster code. Ignoring the importance of cache coherency on modern hardware can be dangerous to the performance of your software.
You should definitely favor dynamic arrays over linked lists where you can.
If you need to insert at the beginning or middle of a sequentially data structure, and your data structure is small (a few dozen nodes or less), you should probably prefer a dynamic array unless each node itself has quite the copy overhead.