C++ 如何正确删除双链表中的节点? void SinglyLinkedList::removeBike(int c) { 节点*电流=头部; 对于(int i=0;i下一步; } 如果(当前->下一步!=NULL&当前->上一步!=NULL){ 当前->上一个->下一个=当前->下一个; 当前->下一个->上一个=当前->上一个; 删除当前;//删除节点 } else if(当前->下一步==NULL){ 当前->上一个->下一个=当前; 删除当前文件; } else if(当前->上一个==NULL){ 当前->下一个->上一个=当前; 删除当前文件; } 其他的 不,绝对不是那么简单
首先,如果C++ 如何正确删除双链表中的节点? void SinglyLinkedList::removeBike(int c) { 节点*电流=头部; 对于(int i=0;i下一步; } 如果(当前->下一步!=NULL&当前->上一步!=NULL){ 当前->上一个->下一个=当前->下一个; 当前->下一个->上一个=当前->上一个; 删除当前;//删除节点 } else if(当前->下一步==NULL){ 当前->上一个->下一个=当前; 删除当前文件; } else if(当前->上一个==NULL){ 当前->下一个->上一个=当前; 删除当前文件; } 其他的 不,绝对不是那么简单,c++,list,pointers,nodes,C++,List,Pointers,Nodes,首先,如果c参数超过了列表的大小,那么当当前指针命中最后一个节点上的空指针并经过它时,您将使用空指针取消引用 然后,如果c为0或列表中最后一个元素的索引,则它的prev或next指针相应地将为null,并且您还将使用null指针取消引用 void SinglyLinkedList::removeBike(int c) { Node* current = head; for(int i = 0; i < c; i++){ // traverse to desir
c
参数超过了列表的大小,那么当当前指针命中最后一个节点上的空指针并经过它时,您将使用空指针取消引用
然后,如果c
为0或列表中最后一个元素的索引,则它的prev
或next
指针相应地将为null,并且您还将使用null指针取消引用
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?";
}
如果current
是列表中的第一个元素,current->prev
将明显为空。如果current
是列表中的最后一个元素,current->next
将明显为空。猜猜当您尝试取消引用空指针时会发生什么
结论:
A) 检查函数的输入参数是否有效
B) 当要删除的节点是双链接列表中的第一个或最后一个节点时,提供特殊处理
编辑:根据流行的请求,有人想知道我将如何解决此问题:
current -> prev -> next = current -> next;
current -> next -> prev = current -> prev;
void SinglyLinkedList::removeBike(int c)
{
节点*电流=头部;
对于(int i=0;i下一步;
}
如果(!当前)
return;//或者抛出异常。或者返回bool false,可能是。
如果(当前->上一个)
当前->上一个->下一个=当前->下一个;
其他的
头部=当前->下一步;
如果(当前->下一步)
当前->下一个->上一个=当前->上一个;
其他的
tail=current->prev;//假设这附近有一条尾巴。。。
删除当前;//删除节点
//也许“返回真实”;这里。。。
}
我所见过的计算链表的最佳方法是在一张纸上画出节点,然后一步一步地画出链接中所需的所有更改。for(int I=0;I
应该是for(int I=0;I
&¤t!=NULL对我来说效果更好……然后,在循环结束后,当你遇到NULL电流时,你必须弄清楚该怎么办。@Josh停止编辑你的问题,尝试修复代码。不要创建使当前答案无效的移动目标。这没有用。在第一行的第一行,它会打断我语句。完成编辑。啊,不知道我是怎么搞砸的。我甚至没有想到第一个或最后一个是想要的。哇。感谢你的输入!如果我做了之后还有其他问题,我会编辑的。不,不需要记下这个。这是一个有效的问题。@SamVarshavchik一个完全固定的SingleLinkedList的代码示例::removeBike()
函数至少会很好。“根据流行的请求”到目前为止我还没有意识到我是一个如此受欢迎的人:-P,但是THX。尽管挑剔//可能是“return true”;这里…
函数返回类型实际上是void
。@πάνταῥεῖ 我认为返回true
是一个建议,您将更改函数签名。我也同意,很高兴知道它是否已被删除。
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...
}