2016-03-17 2 views
-1

Как удалить последний узел в односвязном списке? Это не так, как с головой, когда я мог бы просто написать это:Одиночный список, удаляющий последний узел

void DeleteNode (node *& head, node *& tail, int val) 
{ 
    node * p = nullptr; 
    node * tmp = nullptr; 

    if (val == head -> data) 
    { 
     delete head; 
     head = head -> next; 
    } 
... 

я могу удалить последний узел, как что:

if (val == tail -> data) 
{ 
    delete tail; 
} 

Но тогда, как я могу установить хвост к предыдущему узлу (в двукратно связанный список, я мог бы просто написать tail = tail -> prev для переключения на предыдущий узел).

Я пытался что-то вроде этого:

tail = head; 
while (tail != nullptr) 
{ 
    tail = tail -> next 
} 

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

структура списка:

struct node 
{ 
    int data; 
    node * next; 

    node() : next (nullptr) { } 

}; 
+0

Почему существует так много связанных список вопросов в данный момент? Это время, связанное с учебным временем в университете? – Matt

ответ

4

Вы можете удалить последний узел, используя свой код, но он не очищает запись хвост из связанного списка.

Чтобы решить проблему, вы должны поехать в ближайший узел хвостового узла оттуда,

  1. вы должны удалить последний узел
  2. набор null к next от ближайшего узла.

Теперь посмотрим, правильный код,

prev = NULL; 
tail = head; 
while (tail->next != NULL) { 
    prev = tail; 
    tail = tail->next; 
} 
delete tail; // tail points to the last node 
if (prev) { 
    prev->next = NULL; // now pre points to the new last node 
} 
Смежные вопросы