java 双向链表删除_从双向链表中删除节点
发布日期:2021-06-24 15:42:50 浏览次数:3 分类:技术文章

本文共 1270 字,大约阅读时间需要 4 分钟。

由于你没有提供,你的链表是什么样的,我将假设我的代码示例,它是一个包含指向链表的 head (第一个元素)的指针的结构 . 它由 your_list 引用 .

问题在于代码中的前两个 if -blocks;

第一个 if : if(!node->next_ && !node->prev_) :

这意味着您要删除列表的head元素 . 在这种情况下,您必须将头显式设置为 NULL ,而不是将指向要删除的节点的指针设置为 NULL (通过将其设置为其前一个,即 NULL ) . 此外,通过释放前一个节点,您可以释放 NULL -Pointer . 这是自己不是问题,但你想删除 node ,而不是它的前身 .

第二个 if : if(!node->prev_ && node->next_) :

这意味着您要删除头部,但删除节点后列表不会为空 . 在这种情况下,您必须将列表的头部设置为指向新头部,该头部将是 node->next_ 指向的节点 . 此外,您与之前的 free() 有类似的问题 .

解决这两点,您的代码应该按照以下方式执行:

void removeNode(struct student_record_node *node){

if(!node->next_ && !node->prev_){

your_list->head = NULL; // Remove head - List is now empty.

student_record_node_deallocate(node);

node = NULL; // Set freed pointer to NULL, for safety.

}

else if(!node->prev_ && node->next_){

your_list->head = node->next_; // Set the head to the new head.

student_record_node_deallocate(node);

node = NULL; // Set freed pointer to NULL, for safety.

}

else if(node->next_ && node->prev_){

node->prev_->next_ = node->next_;

node->next_->prev_ = node->prev_;

student_record_node_deallocate(node);

node = NULL; // Set freed pointer to NULL, for safety.

}

else if(node->prev_ && !node->next_){

node->prev_->next_ = NULL;

student_record_node_dealocate(node);

node = NULL; // Set freed pointer to NULL, for safety.

}

}

转载地址:https://blog.csdn.net/weixin_33613462/article/details/114202773 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java sqlite 建表语句_SQLite不能创建表
下一篇:java awt 弹出框_java用awt 点击菜单或按钮弹出一个对话框 对话框dialog我创建了 为什么就是点了后没反应...

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月17日 14时03分12秒