How to Implement Undo/Redo for a Half-Edge Data Structure?

Recently, I had to review code for undo/redo functionality for a half-edge data structure. This made me reflect on how different programmers approach problem-solving, considering the trade-offs between the development costs and the efficiency of the resulting solution. I would like to discuss all the possible approaches and how they ultimately impact the final solution, [ ]