Во-первых, в вашем коде вам не нужны дополнительные tempNode
, просто используйте temp
и сделайте его локальным для внутреннего блока:
for (int count = size; count--; ) {
ListNode *temp = malloc(sizeof(*temp));
temp->value = count;
temp->next = head;
head = temp;
}
Если вы хотите добавить элементы вв конце вы должны сохранить указатель на последний узел, tail
:
ListNode *head = NULL;
ListNode *tail = NULL;
for (int count = 0; count < size; count++) {
ListNode *temp = malloc(sizeof(*temp));
temp->value = count;
temp->next = NULL;
if (tail == NULL) {
head = temp;
tail = temp;
} else {
tail->next = temp;
tail = temp;
}
}
Существует более элегантный способ сделать это: вместо того, чтобы хранить указатель на последний узел, сохраняйте указательна нулевой указатель, куда должен идти следующий элемент:
ListNode *head = NULL;
ListNode **tail = &head;
for (int count = 0; count < size; count++) {
ListNode *temp = malloc(sizeof(*temp));
temp->value = count;
temp->next = NULL;
*tail = temp;
tail = &(*tail)->next;
}
В начале *tail
содержит адрес head
, после этого он будет содержать адрес члена next
последний узелВы можете обновить оба с помощью указателя tail
без необходимости проверки, является ли список пустым.
Этот последний метод поначалу выглядит немного устрашающе с его ListNode **tail
, но как только вы получите зависаниеэто полезный инструмент, чтобы иметь. Если вам это пока не нравится, используйте первый вариант.
Стоит ли усилий только для составления списка вперед? Вставка в список спереди очень проста, и после очистки ваш оригинальный вариант выглядит чистым и компактным для меня.