In push, the new node's next pointer isn't set to null if the list isn't empty.
In pop, you return the value in the node before you delete the node and so the node is never actually deleted. The compiler ought to be warning you about unreachable code at this point.