删除链表末尾的节点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
,然后您正试图将其删除。所以你实际上是在删除……什么都没有。
- 检查
temp1
是否不是 NULL
- 检查
temp1->next
是否不是 NULL
- 检查
temp2
是否不是 NULL
将 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;
}
希望你到目前为止过得愉快 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
,然后您正试图将其删除。所以你实际上是在删除……什么都没有。
- 检查
temp1
是否不是NULL
- 检查
temp1->next
是否不是NULL
- 检查
temp2
是否不是NULL
将
head
设置为NULL
iftemp1 == 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;
}