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

时间:2015-07-24 10:18:21

标签: c++ linked-list stack

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

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

3 个答案:

答案 0 :(得分:3)

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;

顺便说一句,您希望添加健壮性来防范具有空头或单个元素的列表。

答案 1 :(得分:3)

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

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

    ,请将NULL设置为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;
        }
    }
    

答案 2 :(得分:1)

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

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

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

    delete *n;
    *n = 0;
}