Have you implemented a bouncing ball without the list yet?
Your list does not need an iterator. Don't over-complicate this.
You're not storing unknown objects here. Use a ball* instead of a void* in your node struct. When you add a node to the list you should be taking a ball pointer as an argument and attaching it to the new node.
While it is sometimes useful to track the size of a list, there is no need or requirement to do so in this case. You can simply have a node pointer as your root and ignore the size.
It looks like you don't quite know how to traverse the list. I'm guessing this is where the iterator came from. If the list is empty then the root node should be null. Otherwise it will point to the first element. If there's no next item then that element's 'next' should be null. When you need to remove the last element you'll need two pointers, one for the previous node and one for the current node. Walk through the list updating them as you go so that when the current node has a 'next' that equals null you can delete it and set prev->next = null.
Adding to the end of the list is simpler, just walk the list to the end and tack on the new node.
Walking the list to the end looks like this:
if!(root) { /* list is empty */ }
listnode_t node = root;
while(node->next) {
node = node->next;
}
// 'node' now points to the last node.
If you need to do some work on the list items, like - for example - updating their physics or drawing them, then just pass them each to the relevant functions as you traverse the list.
Understand?