删除链表末尾的节点
Deletion of node at end of linked list C++
希望你有一个美好的一天/晚上到目前为止,我正试图实现一个堆栈使用链表,我几乎知道如何在列表的末尾插入一个项目。我试图删除列表末尾的一个节点,但我无法正确执行。
void Pop(){
Node* temp1 = head;
Node* temp2 = NULL;
while(temp1 != NULL){
temp2 = temp1;
temp1 = temp1->next;
}
delete temp1;
temp2->next = NULL;
}
这是我删除列表末尾节点的代码。我尝试了很多,但这并没有使程序停止执行或无限输出数字。
因此,我"push"了3个数字,并在每次"push"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;
}
相关文章:
- 反向给定链表中的K节点
- 我们可以删除链表中静态内存中的节点吗
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 如何按数字顺序插入链表节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 在C++的链表末尾插入一个节点
- 在解决链表问题时创建一个额外的节点是一个好习惯吗?
- 插入一个基本的单向链表节点似乎破坏了我的 c++ 代码?
- 修改链表主函数代码,用户将在其中输入节点的索引和数据以及正确的消息
- 删除链表中的特定节点
- 在 c++ 中,在链表节点上使用括号有什么意义?
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 删除链表中的节点 - 分段错误
- 使用函数引用指向节点的指针删除链表中的节点?
- 节点链表中的对象
- 虚拟头节点链表
- C++ 删除类似的节点链表
- c++删除节点链表导致程序崩溃
- 排序节点(链表)c++