单链表删除最后一个节点



如何删除单向链表中的最后一个节点?当我可以写这个时,它不像头:

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 ) { }
};

您可以使用代码删除最后一个节点,但它不会从链表中清除尾条目。

要解决您的问题,您必须从那里前往最近的尾节点,

  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
}

相关内容

  • 没有找到相关文章

最新更新