【问题标题】:Deletion of node at end of linked list C++删除链表C ++末尾的节点
【发布时间】:2015-10-14 23:24:15
【问题描述】:

希望到目前为止您度过了愉快的一天/一夜,我正在尝试使用链表实现堆栈,并且我几乎知道如何在列表末尾插入一个项目。我正在尝试删除列表末尾的一个节点,但我无法正确执行。

void Pop(){

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

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

}

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

所以我“推送”了 3 个数字,并在每次“推送”和“弹出”之间打印了两次,并在两者之间打印了结果。但是输出是这样的:

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

我想要发生的事情是这样的:

1
1 2
1 2 3
1 2
1

提前致谢!:D

【问题讨论】:

  • 在调试器中运行它,并在 delete temp1 之前设置一个断点;检查temp1 是什么。
  • 在发布此问题之前,您可以使用调试器检查 temp1 指向的内容。

标签: c++ linked-list stack


【解决方案1】:

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;

顺便说一句,您需要增加鲁棒性以防止带有空头或单个元素的列表。

【讨论】:

  • 啊,谢谢,现在我意识到它应该是 while 循环中的 temp1->next。这也教会了我一些东西。谢谢。
【解决方案2】:

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

  1. 检查temp1 是否不是NULL
  2. 检查temp1->next 是否不是NULL
  3. 检查temp2 是否不是NULL
  4. 如果temp1 == head,则将head 设置为NULL

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

【讨论】:

  • 是的,我意识到它停在 null 这就是问题所在。这有帮助,谢谢!
【解决方案3】:

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

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

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

    delete *n;
    *n = 0;
}

【讨论】:

  • 我明白了,我不太确定如何使用指针对指针,但我会仔细阅读并确保它能够使用它,谢谢。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多