如何删除单链表中的最后一个节点?当我写这篇文章时,它与头脑不一样:
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 :(得分:4)
您可以使用您的代码删除最后一个节点,但不会从链接列表中清除尾部条目。
要解决您的问题,您必须从那里前往最近的尾节点节点,
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
}