Wie kann ich den speicher denn hier wieder sauber freigeben?
Das funktioniert nicht, da es für Records leider keinen virtuellen Destructor gibt, den man überschreiben könnte.
Mit dem Pointer auf den nächsten Record weis der Delphi-Compiler nichts anzufangen.
Warum speicherst du deine Ziffern in einer verketten Liste von Records?
Ein einfacher String oder ein dynamisches Array können fast beliebige Anzahl von Ziffern in einem Record aufnehmen.
Verkettete Listen sind eher etwas für Lernübungen mit Pointern. Im Normalfall sind Array bzw. TList schneller und einfacher zu benutzen.