天天看點

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.

}

}