天天看点

java 双向链表删除_从双向链表中删除节点

由于你没有提供,你的链表是什么样的,我将假设我的代码示例,它是一个包含指向链表的 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.

}

}