<p>I'm working on an assignment that is telling me to assume that I have a singly linked list with a header and tail nodes.  It wants me to insert an item y before position p.  Can anybody please look over my code and tell me if I'm on the right track?  If not, can you provide me with any tips or pointers (no pun intended)?  </p>

<pre><code>tmp = new Node();
tmp.element = p.element;
tmp.next = p.next;
p.element = y;
p.next = tmp;
</code></pre>

<p>I think I may be wrong because I do not utilize the header and tail nodes at all even though they are specifically mentioned in the description of the problem.  I was thinking of writing a while loop to traverse the list until it found p and tackle the problem that way but that wouldn't be constant-time, would it?</p>

Just write it down if you get stuck with an algorithm:
```
```
// First we have a pointer to a node containing element (elm) 
// with possible a next element.
// Graphically drawn as:
// p -> [elm] -> ???

tmp = new Node();
// A new node is created. Variable tmp points to the new node which 
// currently has no value.
// p   -> [elm] -> ???
// tmp -> [?]

tmp.element = p.element;

// The new node now has the same element as the original.
// p   -> [elm] -> ???
// tmp -> [elm]

tmp.next = p.next;

// The new node now has the same next node as the original.
// p   -> [elm] -> ???
// tmp -> [elm] -> ???

p.element = y;

// The original node now contains the element y.
// p   -> [y] -> ???
// tmp -> [elm] -> ???

p.next = tmp;

// The new node is now the next node from the following.
// p   -> [y] -> [elm] -> ???
// tmp -> [elm] -> ???
```
```
You have the required effect, but it can be more efficient and I bet you can now find out yourself.
It is more clear to write something like:
```
```
tmp = new Node();
tmp.element = y;
tmp.next = p;
p = tmp;
```
```
Which of course does not work if p is not mutable. But your algorithm fails if p == NULL.
But what I meant to say, is, if you have problems with an algorithm, just write the effects out. Especially with trees and linked lists, you need to be sure all pointers are pointing to the righ direction, else you get a big mess.