Te mueves al nodo anterior al último y le dices:
Ultimo = nulo //se da por hecho que también existe una referencia al último.
Nodo.Siguiente = nulo //(entendiendo que nodo.Siguiente apunta al último, esto es que nodo es el penúltimo).
Ultimo = Nodo
NumNodos -=1
Si la lista es doblemente enlazada, puedes hacer:
Ultimo= Ultimo.Anterior
Ultimo.Siguiente = nulo
NumNodos -=1
Te das cuenta entonces que para eliminar el primer nodo (de esta misma manera), (cuando es a la vez el primero y el último), te exige tener un nodo raíz (como te explicaba en otro mensaje).
No es estrictamente necesario, pero eliminar el raíz debe asociarse con la operación de eliminar la lista, y añadir elementos a una lista vacía, debe separarse de crear la lista vacía (creando un nodo raíz que no cuente)... Por que así te liberas de comprobar con cada añadido si está vacía y con cada eliminado si queda vacía. Visto desde el exterior está vacía, visto desde el programasdor si existe la lista siempre hay un nodo raíz y por tanto no está vacía (del todo).
Pero mejor experimenta... para entender lo que te digo...
Recuerda que (de modo general) un objeto se elimina cuando el número de referencias llega a 0, de ahí la importancia de eliminar referencias si tienes también otros miembros que lo tienen referenciado.