In addition to the sound advice provided,
if (headnode == null)
headnode = new Nodes(d);
Nodes dummy = new Nodes(d);
dummy.Next = headnode;
headnode = dummy;
nodecount++ immediately strikes out as something that should be outside of the conditionals blocks since it happens regardless of control flow.
Be aware of algorithm complexity
Much of the appeal of a linked list is offering constant time insertion and deletion from both ends of the list. You do have the ability to do head operations such as prepend well, however anything to the tail end requires you to iterate through the entire list. Adding a
Tail Node and having a
prev field for Node would allow you append and remove from tail in O(1) rather than the current linear time O(n) operations.