Этот код работает на Xcode, но не работает в компиляторе leetcode
Ну, код не работает на любой платформе.
ТестВы сделали на XCode, должно быть, было неполным, поскольку код имеет неопределенное поведение на любой платформе.
Посмотрите на этот простой пример:
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
struct ListNode *next;
int val;
};
void printList(struct ListNode* p)
{
if (p)
{
printf("%p %d", (void*)p, p->val);
while(p->next)
{
printf("->");
p = p->next;
printf("%p %d", (void*)p, p->val);
}
}
printf("\n");
}
// Function from question
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode *beforeNode = head;
while(beforeNode != NULL){
if(head == beforeNode && head->val == val){
struct ListNode* q = head;
head = q->next;
beforeNode = head;
free(q);
}
else if(beforeNode->next != NULL && beforeNode->next->val == val){
struct ListNode *p = beforeNode->next;
beforeNode = p->next;
printf("Free val %p %d\n", (void*)p, p->val);
free(p);
}
else
beforeNode = beforeNode->next;
}
return head;
}
int main()
{
// Initialize a list with three element like: 1->42->1->NULL
struct ListNode *head = malloc(sizeof *head);
head->val = 1;
head->next = malloc(sizeof *head);
head->next->val = 42;
head->next->next = malloc(sizeof *head);
head->next->next->val = 1;
head->next->next->next = NULL;
printList(head);
removeElements(head, 42);
printList(head);
return 0;
}
Пример вывода:
0x558311c02260 1->0x558311c02280 42->0x558311c022a0 1
Free val 0x558311c02280 42
0x558311c02260 1->0x558311c02280 42
Как видите, есть две проблемы:
Результирующий список 1-> 42, но мы ожидали 1-> 1 Другими словами - список не работает.
Узел, напечатанный в последней строке, является узлом, который мы только что освободили (т. Е. 0x558311c02280).Это неопределенное поведение.
Проблема в этой строке:
beforeNode = p->next;
Это должно быть
beforeNode->next = p->next;
Вывод после вышеуказанного изменения:
0x561def3e6260 1->0x561def3e6280 42->0x561def3e62a0 1
Free val 0x561def3e6280 42
0x561def3e6260 1->0x561def3e62a0 1
Теперь список верный и использование свободной памяти не используется.