LinkedList - Como liberar a memória alocada usando malloc

Eu tenho um código C muito simples para construir uma lista Singly Linked como abaixo, no qual aloco memória dinamicamente para cada nó usando malloc. No final do código, quero liberar a memória para cada nó alocado, estava pensando em como fazê-lo - se eu começar do nó principal e liberá-lo, os ponteiros para os nós subsequentes serão perdidos e ocorrerá um vazamento de memória.

Outra maneira é iniciar a partir do nó principal e continuar armazenando o ponteiro do nó em uma matriz separada de ponteiros ou algo assim, percorrer a lista até o ponteiro final, enquanto armazena os ponteiros do nó, e quando chegar ao nó final, armazene-o também na outra matriz de ponteiros e comece a liberar esse índice de matriz para trás até que o nó principal seja liberad

Essa é a única maneira de conseguir o que estou tentando fazer?

Caso não queira usar o segundo buffer, como faço para fazê-l

#include "stdio.h"
#include "stdlib.h"

struct lnk_lst 
{
   int val;
   struct lnk_lst * next;
};

typedef struct lnk_lst item;


main()
{
   item * curr, * head;
   int i,desired_value;

   head = NULL;

   for(i=1;i<=10;i++) 
   {
      curr = (item *)malloc(sizeof(item));
      curr->val = i;
      curr->next  = head;
      head = curr;
   }

   curr = head;


   while(curr) {
      printf("%d\n", curr->val);
      curr = curr->next;
   }

  //How to free the memory for the nodes in this list?
   for(i=1;i<=10;i++)
   {
       free()//?? What logic here
   }


}

questionAnswers(5)

yourAnswerToTheQuestion