Still I have one more question left behind:
why it does not have to call dispose(head) right after the recursion call to 'Kill it self'?
while head <> nil do
head := RemoveStart(head);
Hi
Well, if you look closer in this function:
function removeStart(head:PNode):PNode;
var
tmp: PNode;
begin
tmp := head;
removeStart:=head^.next;
Dispose(tmp);
end;
It will eventually reach the end of the list, i.e.:
the next pointer points to NIL, which is what the above function returns and you check for
Head <> nil.
When the loop stops, it's because head has become NIL(
head := RemoveStart(head);), thus all the nodes including the Head has been removed / disposed of...
>> Short answer: There's no need <<

HTH
Regards Benny