I have implemented an indexed linked list that runs (under mild assumptions) all single-element operations in $\mathcal{O}(\sqrt{n})$ time. The description is here and Java implementation is here.
It’s clear to me that the running time is linear in $n$ in the worst case, but I would love to see something smarter than that.
The idea is to maintain a list of fingers. Each finger $f$ has two fields: (1) $f.node$ pointing to a linked list node, and (2) $f.index$ being the actual index of the node pointed by $f.node$.
Now, the finger list has size $\lceil \sqrt{n} \rceil$, and it’s sorted by finger indices. Given an element index $i$, we can access it as follows:
Apply C++ lower_bound to find the closest to $i$ finger $f$, and ”rewind” $f.node$ to point to the $i$th node. (Set $f.index \leftarrow i$ also.) This applies to the get operation and runs in logarithmic time. Assuming that the fingers are distributed more or less evenly, rewinding will run in $\mathcal{O}(n / \sqrt{n} = \sqrt{n})$ time.
For the insert/removeAt operations, both do (1) finger list lookup in logarithmic time, (2) finger node rewind in $\mathcal{O}(\sqrt{n})$, and (3) also update the finger indices that runs in, too, $\mathcal{O}(\sqrt{n})$.