删除链接列表的最后一个节点

时间:2014-10-22 13:13:59

标签: c++ linked-list delete-operator

我正在尝试删除链表的最后一个节点, 我有列表的第一个元素。但是这个功能不起作用如果你能帮助我我会很高兴

代码 -

void deleteNode(Node* firstNode)
{
    Node* currNode = firstNode;
    while (currNode->next != NULL)
    {
     currNode = currNode->next;
    }
     delete currNode->next;
     currNode->next = NULL;
 }

7 个答案:

答案 0 :(得分:2)

您需要考虑以下几点:

  • 任何可能影响头指针的操作必须提供一种机制,用于返回更新的头指针(一个输入/输出参数,即指向指针或指针引用的指针,或者通过函数返回结果;我更喜欢前者。
  • 任何指针都包含列表中最后一个节点的地址,无论是头指针还是其他任何指针,必须设置为NULL。

那就是说,

指针指针

void deleteLastNode(Node** firstNode)
{
    while (*firstNode && (*firstNode)->next)
        firstNode = &(*firstNode)->next;
    free(*firstNode);   /**/
    *firstNode = NULL;  /**/
}

请注意,如果传入in-address的指针已经为NULL,上面标有/**/行都不需要执行,但是无害,因为{{ 1}} - 根据标准支持free()作为无操作。

通过传递头部指针的地址来调用,如果列表为空,必须的内容为NULL

NULL

指针的引用

使用C ++,您还可以通过引用传递头指针,例如:

Node *head = NULL;
//... code to populate the list.

deleteLastNode(&head);

调用为:

void deleteLastNode(Node*& head)
{
    Node **firstNode = &head;
    while (*firstNode && (*firstNode)->next)
        firstNode = &(*firstNode)->next;
    free(*firstNode);   /**/
    *firstNode = NULL;  /**/
}

您选择哪种机制取决于您。

答案 1 :(得分:2)

您正在删除最后一个节点之后的节点,无论如何都应为NULL。

void deleteNode(Node* firstNode)
{
    //first check if firstNode is NULL or last node.
    if(firstNode == NULL)
        return;

    if(firstNode->next == NULL)
    {
        delete firstNode;
        firstNode = NULL;
        return;
    }

    Node* currNode = firstNode;
    while (currNode->next && currNode->next->next != NULL)
    {
        currNode = currNode->next;
    }
    delete currNode->next;
    currNode->next = NULL;
}

答案 2 :(得分:1)

您将在最终节点之后删除一个。

delete currNode;

答案 3 :(得分:1)

试试这个:

void deleteNode(Node *firstNode)
{
    Node* currNode = firstNode;
    Node* nextNode = firstNode->next;
    while(nextNode != NULL)
    {
        currNode = nextNode;
        nextNode = nextNode->next;
    }
    delete currNode;
}

答案 4 :(得分:1)

代码的问题是,在最后一个实例中,curNode指向列表的最后一个节点。当您删除curNode时,您将不再留下节点,即数据和下一部分。所以你现在无法访问curNode的下一部分。此代码将导致运行时错误:

void pop_back(struct node** firstNode)
{
    struct node* p = *firstNode;

    if(p == NULL) 
        cout << "List empty." << endl;

    else if(p->next == NULL){
        cout << "Element " << p-> data << " deleted." << endl;
        delete *firstNode;
        *firstNode = NULL;
    }

    else
    {
        while(p->next->next != NULL){
            p= p->next;
        }

    struct node* temp = p-> next;
    p->next = NULL;
    cout << "Element " << temp->data << " deleted." << endl;
    delete temp; 
    }
}

而是试试这个:

如果列表只包含一个元素,则firstNode指向NULL并删除唯一的节点。如果列表中有两个以上的项,则必须迭代到最后一个第二个元素,将其下一个值设置为NULL,并在临时指针的帮助下删除最后一个节点。

ShowLoadingAlert

答案 5 :(得分:0)

void delBottom()
{
    clrscr();
    Node *nb=H;              //current
    Node *nn=(H->getNext()); //next
    if(NULL==H)
    {
        cout<<"List Empty";
    }
    else if(H==T)
    {
        delete H;  //H-Head
        H=T=NULL;
    }
    else
    {
        while(NULL!=(nn->getNext()))
        {
            nb=nn;
            nn=nn->getNext();
        }
        delete nn;
        nb->setNext(NULL);
        T=nb;  //T-Tail
    }
}

答案 6 :(得分:-2)

实际上,你应该这样写:

void deleteNode(Node* firstNode)
{
    Node* currNode = firstNode;
    while (currNode->next != NULL)
    {
     currNode = currNode->next;
    }
     ***delete currNode;
     currNode = NULL;***
 }

原因,currNode是最后一个节点。