Попробую как-нибудь рассказать :) Первый момент - надеюсь понятно, что если нет головы, то она создается, а если есть - то добавляется элемент. В коде указан некий класс Node. При создании объекта от этого класса принимаем значение val как значение этого объекта. Также в данном объекте есть ссылка на следующий объект, что необходимо для реализации списка.
Допустим есть 1 элемент в списке. Каждый элемент - это объект класса Node. В нем есть некое значение, и ссылка на слд. объект. Но так как объекта нету, то ссылка указывает на NULL.
Вставляем новый элемент. Для этого создаем новый объект класса Node с необходимым значением. Ссылку, которая введет на слд. объект мы указываем на голову данного списка. Теперь у нас есть 2 разных объекта (при *node = new Node(val) создаются разные объекты класса). И для финиша указываем что голова это наш новый элемент/объект