If all you got is the head of a linked list, and the index ("location") where an insertion must be made, then a linked list is not very handy: you'll have to traverse from the head of the list to the desired location and that takes O() time, where is the desired location. As can in principle be anything between 0 and (where is the current number of nodes in the list), this means the worst and average time complexity is O().
A better structure will be a self-balancing binary search tree (such as AVL, red-black, B-tree, ...), where each node is "augmented" with a property that gives the number of values in the subtree it roots. This allows the values to be stored and traversed (inorder traversal) according to their index. Insertion and deletion then have O(log) time complexity. A particular handy tree data structure for traversal is the B+-tree.
Another one that is as efficient is the skip list. This is a linked list that is augmented with several layers of linked lists, so to allow O(log) access to any index.
If however with "location" it is meant that you get a node reference in a linked list, where the new node must be inserted, then a linked list is fine. But then the question is: how did you get that location? In the end, that is a node reference that must be retrieved somehow, and there is not much else you can do than traverse a list from its head to get such node references... so then we're back to the start of my answer.