Путаница при удалении последнего узла в связанном списке - PullRequest
0 голосов
/ 16 мая 2018

Логика удаления последнего узла следующая справа,

Перейдите к указателю узла, следующим будет NULL, затем освободите его, верно? Я попытался реализовать эту логику в функции:

node* Delete_Last(node*head){
   node* i=head;
   while (i->next!=NULL){
      i=i->next;
   }
   free(i);
   i=NULL;
   return head;
}

Когда я пытаюсь напечатать список, я не могу - это бесконечный цикл. Подскажите, пожалуйста, что за недостаток в моей логике и как это исправить?

1 Ответ

0 голосов
/ 16 мая 2018

Нет, это не правильно.Вы также должны обновить предыдущий узел следующим узлом, и заголовок, если заголовок был последним узлом.Поэтому в первую очередь вы должны взять указатель на указатель головы, он вам нужен на случай, если вам нужно обновить заголовок.Во-вторых, поскольку это односвязный список, вы должны сохранить предыдущий узел:

node* Delete_Last(node** head) {
    if (!*head) {
        return 0;
    }

   node* i = *head, *previous = 0;
   while (i->next){
      previous = i;
      i = i->next;
   }
   free(i);
   if (previous) {
       previous->next = 0;
   } else {
       *head = 0;
   }
   return previous;
}

Я не знаю, что вы хотите вернуть, поэтому я предположил, что в вашем коде его новый конец, возвращая голову снова не получаетсясмысл.Теперь вы можете позвонить с помощью:

node* prevLast = Delete_Last(&head);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...