Вам вообще не придется перебирать список, если вы сделаете это задом наперед:
struct ListNode* populateLinkedList(int arr[], int arraysize) {
struct ListNode* head = NULL;
for (int i = arraysize; i > 0; i--) {
struct ListNode* tempNodePtr = (struct ListNode*) malloc(sizeof(*tempNodePtr));
tempNodePtr->data = arr[i - 1];
tempNodePtr->next = head;
head = tempNodePtr;
}
return head;
}
Как вы можете видеть, это намного проще, потому что нет никаких проверок, так как вы всегда заменяете head
и нет необходимости перебирать уже вставленные элементы, так что это также более эффективно.
<Ч />
Что касается того, что не так с вашим решением:
struct ListNode* temp = *node->next;
// ^~~~~~~~~~~
// you definitely shouldn't dereferrence anything here
// This condition is wrong because when you exit the loop "temp" will be NULL
while (temp!=NULL) {
temp = temp->next;
}
temp->next = tempNodePtr;
node->next = temp; // <-- this is definitely not needed
Итак, ваш код должен был выглядеть примерно так:
struct ListNode* temp = node;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = tempNodePtr;