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时,它会中断。我也应该把这个班级改名为双重链表......只是注意到了
答案 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...
}