如何正确删除双链表中的节点?

时间:2016-02-23 00:02:40

标签: c++ list pointers nodes

void SinglyLinkedList::removeBike(int c)
{
   Node* current = head;

   for(int i = 0; i < c; i++){         // traverse to desired node
       current = current -> next;
   } 

   if(current -> next != NULL && current -> prev != NULL){
        current -> prev -> next = current -> next;
        current -> next -> prev = current -> prev;
        delete current;                     //delete node
   }
   else if(current -> next == NULL){
      current -> prev -> next = current;
      delete current;
   }
   else if(current -> prev == NULL){
       current -> next -> prev = current;
       delete current;
   }    
   else 
       cout << "How did you make it this far?";

}

我很确定我在这里不了解一些东西,但研究到目前为止还没有帮助。

从逻辑上讲,这对我来说很有意义,但我觉得这样做太简单了,但事实并非如此。

编辑:更新代码减去输入检查,当我输入任何int时,它会中断。我也应该把这个班级改名为双重链表......只是注意到了

1 个答案:

答案 0 :(得分:6)

不,这绝对不是那么简单。

首先,如果c参数超出了列表的大小,那么当你的current指针命中最后一个节点上的空指针时,你会用空指针解除引用。 ,并吹过它。

然后,如果c为0或列表的最后一个元素的索引,则相应地,它是prev或它的next指针,将为null,并且您还会使用空指针解除引用。

current -> prev -> next = current -> next;
current -> next -> prev = current -> prev;

如果current是列表中的第一个元素,current->prev显然会为空。如果current是列表中的最后一个元素,current->next显然将为null。猜猜当你试图取消引用空指针时会发生什么?

结论:

A)检查函数的输入参数是否有效。

B)当要删除的节点是双向链表中的第一个或最后一个节点时,提供特殊处理。

编辑:根据大众的要求,有人想知道如何解决这个问题:

void SinglyLinkedList::removeBike(int c)
{
   Node* current = head;

   for(int i = 0; i < c; i++){
       if (!current)
           break;
       current = current -> next;
   } 

   if (!current)
           return; // Or throw an exception. Or return a bool false, maybe.

   if (current->prev)
       current -> prev -> next = current -> next;
   else
       head=current->next;

   if (current->next)
       current -> next -> prev = current -> prev;
   else
       tail=current->prev;  // Assuming that there's a tail, somewhere around here...
   delete current;                      //delete node

   // Maybe "return true;" here...
}