Самое простое решение, чтобы удалить последние 2 элемента из списка, чтобы позвонить deletesEnd()
дважды. Обратите внимание, что deletesEnd()
должен принимать head
в качестве аргумента и возвращать новое значение. Вы хотите удалить последние 2 путем выдачи вложенного вызова:
struct node *deletesEnd(struct node *head) {
struct node *temp, *last;
last = temp = head;
while (temp && temp->next != NULL) {
last = temp;
temp = temp->next;
}
if (last == head) {
free(head);
head = NULL;
} else {
free(last->next);
last->next = NULL;
}
return head;
}
Удаление последнего элемента: head = deletesEnd(head);
Удалить последние 2 элемента: head = deletesEnd(deletesEnd(head));
Простота конструкции более чем компенсирует накладные расходы, перечисляющие список дважды.
Если вы хотите абсолютно определенную функцию, вы можете расширить ваш подход таким образом:
struct node *deleteLast2Nodes(struct node *head) {
struct node *temp, *last;
last = temp = head;
while (temp && temp->next != NULL && temp->next->next != NULL) {
last = temp;
temp = temp->next;
}
if (last == head) {
if (head) {
free(head->next);
}
free(head);
head = NULL;
} else {
free(last->next->next);
free(last->next);
last->next = NULL;
}
return head;
}
Не написать функцию для специально удаления последнего элемента. напишите общую функцию удаления, а затем напишите эту функцию таким образом, чтобы она вызывала общее удаление с соответствующим узлом. Также обратите внимание, что 'head = NULL' ничего не делает эффективно, потому что' head' больше никогда не используется. И будьте осторожны с вашим стилем, введите код как можно красивее. –
Я не знаю, какие изменения мне нужно сделать, чтобы работать, я просто хотел бы объяснить, что мне нужно добавить, поэтому он удалит последние два, я не буду использовать со связанными списками еще =/ – Shofukan
Найдите лист бумаги, нарисуйте на ней свой список. Затем попытайтесь удалить узел вручную, вы вдруг поймете, почему ваша функция не работает. –