删除最后一个节点的单链表

时间:2016-03-17 11:57:11

标签: c++ linked-list

如何删除单链表中的最后一个节点?当我写这篇文章时,它与头脑不一样:

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 个答案:

答案 0 :(得分:4)

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

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

  1. 您必须删除最后一个节点
  2. null设置为最近节点的next
  3. 现在看到正确的代码,

    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
    }
    
相关问题