希望你到目前为止有一个愉快的日/夜,我正在尝试使用链表实现堆栈,而且我非常知道如何在列表的末尾插入一个项目。我正在尝试删除列表末尾的节点,但我无法正确执行。
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
答案 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
,然后你试图删除它。所以你实际上正在删除......没有。
temp1
是否不是NULL
temp1->next
是否不是NULL
temp2
是否不是NULL
如果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;
}