希望你有一个美好的一天/晚上到目前为止,我正试图实现一个堆栈使用链表,我几乎知道如何在列表的末尾插入一个项目。我试图删除列表末尾的一个节点,但我无法正确执行。
void Pop(){
Node* temp1 = head;
Node* temp2 = NULL;
while(temp1 != NULL){
temp2 = temp1;
temp1 = temp1->next;
}
delete temp1;
temp2->next = NULL;
}
这是我删除列表末尾节点的代码。我尝试了很多,但这并没有使程序停止执行或无限输出数字。
因此,我"push"了3个数字,并在每次"push"one_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
,然后你试图删除它。所以你实际上是在删除。没有。
- 检查
temp1
是否为NULL
- 检查
temp1->next
是否为NULL
- 检查
temp2
是否为NULL
-
如果
设置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; } }
当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;
}