Просто запишите это, если вы застряли с алгоритмом:
// 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] -> ???
У вас есть требуемый эффект, но он может быть более эффективным, и я уверен, что теперь вы можете узнать сами.
Более понятно написать что-то вроде:
tmp = new Node();
tmp.element = y;
tmp.next = p;
p = tmp;
Что, конечно, не работает, если p не изменяем. Но ваш алгоритм не работает, если p == NULL.
Но я хотел сказать, что если у вас проблемы с алгоритмом, просто запишите результаты. Особенно с деревьями и связанными списками, вы должны быть уверены, что все указатели указывают в правильном направлении, иначе вы получите большой беспорядок.