typedef struct ListNode {
float coef;   //계수
int expo;   //지수
struct ListNode* link;   //연결된 다음 노드를 가리켜야하니깐 구조체 ListNode와 같은 타입을 가리킬 수 있는 포인터 변수 link를 선언
};

typedef struct ListHead{
ListNode* head;   //리스트의 첫번째 주소를 가지고있는 head를 선언
//head, coef, expo, link
};

요까진 어찌저찌 이해했는데

ListHead* createLinkedList(void) {
ListHead* L;
L = (ListHead *)malloc(sizeof(ListHead));
L->head = NULL;
return L;
}

요기서부터 뚝배기아픔 포인터 개념 넘나 어려운 것

ListHead* createLinkedList(void) {   //ListHead형식에 createLinkedList에서 반환된 값(void)을 주소로 가짐?
ListHead* L;   //L은 ListHead형식의  새로운 포인터 변수
L = (ListHead *)malloc(sizeof(ListHead));   //L에다가 ListHead의 크기만큼 메모리할당 (ListHead *)는 왜 붙음?
L->head = NULL;   //L의 값에 head를 넣을껀데 head=NULL?
return L;   //L값을 반환 즉 윗줄에 의해서 NULL값이 head에 들어감?
}

istHead* createLinkedList(void)요거에 대한 내 이해가 맞는지 설명좀 부탁드립니다 흑흑