Я смотрел на других форумах, как удалять каждый другой узел, но они всегда получают результат 1-> 3, а я хочу 2-> 4. У меня проблемы с этим. Я потратил часы, глядя на это, и любая помощь будет оценена по достоинству. Я добавил несколько операторов printf
, чтобы увидеть, где я ошибаюсь. Это выход я получаю:Удалите каждый другой узел из связанного списка, заданного 1-> 2-> 3-> 4, чтобы получить 2-> 4?
17 3 8 8 20 13 15 17 10 13
current: 17
forward: 3
free: 17
current: 8
forward->next: 8
-------End------
free: 8
current: 8
forward->next: 20
-------End------
free: 8
current: 20
forward->next: 13
-------End------
free: 20
current: 13
forward->next: 15
-------End------
free: 13
current: 15
forward->next: 17
-------End------
free: 15
current: 17
forward->next: 10
-------End------
free: 17
current: 10
forward->next: 13
-------End------
free: 10
current: 13
Вот мой код:
node *deleteEveryOther(node *head)
{
node *forward, *current;
if (head == NULL)
return NULL;
current = head;
printf("\n\ncurrent: %d\n", current->data);
forward = head->next;
printf("forward: %d\n", forward->data);
while(current != NULL && forward != NULL)
{
printf("free: %d\n", current->data);
free(current);
current = forward->next;
printf("current: %d\n", current->data);
forward->next = current->next;
printf("forward->next: %d\n", forward->next->data);
//if(previous->next != NULL)
//previous = previous->next;
printf("-------End------\n\n");
}
return head;
}
Здесь я редактировал (применяя алгоритм я видел) код немного:
узел * deleteEveryOther (узел * head) { узел * прежний, * текущий;
if (head == NULL)
return NULL;
previous = head;
current = head->next;
free(previous);
previous = current;
current = head->next;
while(current != NULL && previous != NULL)
{
previous->next = current->next;
free(current);
previous = previous->next;
if(previous != NULL)
current = previous->next;
}
return head;
}
// ----------------- RECURSIVE ПОДХОД ----------------- ---------
void deleteEveryOtherRecursively(node *head)`
{
if (head == NULL)
return;
node *current = head;
if (current == NULL)
return;
node *forward = head->next;
head = current->next = forward->next;
free(current);
deleteEveryOtherRecursively(head);
}
Что делать, если список имел 6 узлов? то что бы вы хотели, чтобы ваш список был «2-> 4' или« 2-> 6' – Cherubim
Если бы у него было 6 узлов, например 1-> 2-> 3-> 4-> 5-> 6, то я бы хотел мой выход должен быть 2-> 4-> 6. – user6134432
ОК, так что вы хотите, чтобы только четные узлы были правы :) @ user6134432 – Cherubim