删除链表末尾的节点

Deletion of node at end of linked list C++

本文关键字:节点 链表 删除      更新时间:2023-10-16

希望你有一个美好的一天/晚上到目前为止,我正试图实现一个堆栈使用链表,我几乎知道如何在列表的末尾插入一个项目。我试图删除列表末尾的一个节点,但我无法正确执行。

void Pop(){
    Node* temp1 = head;
    Node* temp2 = NULL;
    while(temp1 != NULL){
        temp2 = temp1;
        temp1 = temp1->next;
    }
    delete temp1;
    temp2->next = NULL;
}

这是我删除列表末尾节点的代码。我尝试了很多,但这并没有使程序停止执行或无限输出数字。

因此,我"push"了3个数字,并在每次"push"answers"pop"之间打印它们两次,并在两者之间打印结果。但是输出是这样的:

1
1 2
1 2 3
1 2 3
1 2 3

我希望发生的是:

1
1 2
1 2 3
1 2
1

提前感谢!:D

你的循环旋转,直到temp1变成NULL,然后你试图删除它。所以你实际上是在删除。没有。

  1. 检查temp1是否为NULL
  2. 检查temp1->next是否为NULL
  3. 检查temp2是否为NULL
  4. 如果temp1 == head

    设置headNULL
    void Pop(void) {
        Node *t = head, *p = NULL;
        if (t == NULL) {
            return;
        }
        while (t->next != NULL) {
            p = t;
            t = t->next;
        }
        delete t;
        if (p != NULL) {
            p->next = NULL;
        } else {
            head = NULL;
        }
    }
    

temp1为null时,这意味着您已经到达列表的末尾。当temp1.next的检查为null时,您需要停止。

if (!head)
   return; // or throw ... no element to pop
while(temp1->next){
    temp2 = temp1;
    temp1 = temp1->next;
}
if (temp2) // If the element had a single element, we've just popped head.
  temp2->next = NULL;
else
  head = null;
delete temp1;

作为题外话,您需要添加健壮性,以防止具有空头或单个元素的列表。

其他答案已经正确指出了代码中的错误(循环没有足够早地终止)。我只是想提一下,您可以通过使用指针到指针来避免需要任何tempN指针变量。例如,不是指向节点,而是指向对节点的引用:

void pop( Node **n ) {
    if ( !*n ) {
        return;
    }
    while ( (*n)->next ) {
        n = &(*n)->next;
    }
    delete *n;
    *n = 0;
}