删除链表末尾的节点C++

Deletion of node at end of linked list C++

希望你到目前为止过得愉快 day/night,我正在尝试使用链表实现堆栈,而且我非常知道如何在列表末尾插入一个项目。我正在尝试删除列表末尾的节点,但无法正确执行。

void Pop(){

    Node* temp1 = head;
    Node* temp2 = NULL;

    while(temp1 != NULL){
        temp2 = temp1;
        temp1 = temp1->next;
    }
    delete temp1;
    temp2->next = NULL;

}

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

所以我 "pushed" 3 个数字并将它们打印在每个 "push" 和 "popped" 之间两次,并在两者之间打印结果。但是输出是这样的:

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

我想要发生的是:

1
1 2
1 2 3
1 2
1

提前致谢!:D

temp1 为空时,这意味着您已经到达列表的末尾。当 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;

顺便说一句,您需要增加稳健性以防止出现具有空头或单个元素的列表。

您的循环一直旋转到 temp1 变为 NULL,然后您正试图将其删除。所以你实际上是在删除……什么都没有。

  1. 检查 temp1 是否不是 NULL
  2. 检查 temp1->next 是否不是 NULL
  3. 检查 temp2 是否不是 NULL
  4. head 设置为 NULL if temp1 == head

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

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

void pop( Node **n ) {
    if ( !*n ) {
        return;
    }

    while ( (*n)->next ) {
        n = &(*n)->next;
    }

    delete *n;
    *n = 0;
}