如何删除单向链表中的最后一个节点?当我可以写这个时,它不像头:
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 ) { }
};
您可以使用代码删除最后一个节点,但它不会从链表中清除尾条目。
要解决您的问题,您必须从那里前往最近的尾节点,
- 您必须删除最后一个节点
- 将
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
}