删除最后一个节点,并将尾部更新为最后一个节点

时间:2019-04-11 20:42:29

标签: c++

我想删除链表中的最后一个节点,但是似乎做错了,因为没有元素被删除。

void deleteTail(){
    node *temp = head;
    int iterator = 1;
    if (head == NULL)
    {
        cout<<"Nothing to be deleted."<<endl;
    }
    else if (head == tail)
    {
        temp = head;
        delete(temp);
        head = NULL;
        tail = NULL;
    }
    else
    {
        while(temp->next != NULL){
            temp = temp -> next;
        }
        tail = temp;
        temp = temp->next;
        delete(temp);
    }
}

如果链接列表是        1-> 2-> 3-> 4-> 5-> NULL 我希望它变成        1-> 2-> 3-> 4-> NULL。 我的代码在做什么错? 预先感谢!

3 个答案:

答案 0 :(得分:1)

这应该可以完成工作。

while (temp->next != NULL && temp->next->next != NULL) {
    temp = temp->next;
}

tail = temp;
delete temp->next;
temp->next = NULL;

问题出在循环的结尾,temp指向最后一个元素。之后,将temp设置为temp->next,或者将NULL设置为。之后,您将通过delete调用NULL,而该呼叫什么都不做。

编辑:当然,这会进入最后一个else块。

答案 1 :(得分:0)

编辑:由于这是原始问题,因此将倒数第二个节点删除。

您需要跟踪以前的节点。当您删除最后一个节点(倒数第二个节点)之前的节点时,尾部保持不变,但是您必须将倒数第二个节点之前的节点指向尾部:

while (temp->next != NULL) {
    if ((temp->next->next != NULL) &&        
        (temp->next->next->next == NULL)) {  // the second node after temp is tail
        delete temp->next;                   // delete second-to-last node
        temp->next = tail;       // two nodes back set to tail
        break;
    }
    temp = temp->next;
}

答案 2 :(得分:0)

while(temp->next != NULL){
    temp = temp -> next;
}
tail = temp;
temp = temp->next;
delete(temp);

确实很接近,但是while(temp->next != NULL)仅在链接列表的末尾为假。这意味着代码已迭代到最后一个节点,为其本身分配了tail,并删除了终止链接列表的空指针。

代替

while(temp->next != tail){
    temp = temp -> next;
}
tail = temp;
temp = temp->next;
delete(temp);
tail->next = NULL;

此操作将在指向列表中倒数第二个tail的节点上停止,将倒数第二个分配为新的taildelete旧的{{1} },并以tail

终止新的tail

有一个出色的general case using a pointer to a pointer here,可以大大简化代码。