Either if you want to insert at the end of the list or at the beginning of the list, you're going to have $O(1)$ Complexity for that and $O(1)$ space.
If you want to insert at the beginning of the list, you just make the new list head the node you want to insert, and link it to the previous list head.
If you want to insert at the end of the list, you can also hold the end of the list as a pointer and insert a new node after it.
If you want to insert in an arbitrary place in the list, then linearly going there is going to be the best you can do ( to my knowledge ).
Statistically you'll have to go through $(n+1)/2 $ nodes to get through yours.