我的教科书有以下代码,用于从链表中删除元素。
void remove(double num)
{
Node *cur, *prev;
if(!head){
return;
}
if(head->data == num)
{
cur = head;
head = head->next;
delete cur;
}
else{
cur = head;
while(cur!=NULL && cur->data != num)
{
prev = cur;
cur= cur->next;
}
if(cur)
{
prev->next = cur->next;
delete cur;
}
}
}
我对此代码有几个问题。首先,如何删除未动态分配的值?为什么有必要这样做?我在任何地方都没有看到新声明。其次,为什么这个代码块是必要的?为什么它需要在 if 语句中?
if(cur)
{
prev->next = cur->next;
delete cur;
}
首先,此代码假定节点是动态分配的。这就是链表通常的构造方式。如果您的代码使用堆栈上的节点,则只需删除delete
语句即可。(并稍微考虑一下您将如何跟踪正在使用的节点。
其次,该代码块是必要的,因为它删除了要删除的节点(如果该节点存在(。它位于if
块中,以防节点不存在。在纸上绘制一个简单的示例,并逐步浏览代码,看看如果您尝试删除不在列表中的元素会发生什么情况。
delete
以前未分配new
的值是不正确的。我认为你的教科书暗示了new
分配。
关于你的第二个问题,之后
while(cur!=NULL && cur->data != num){...}
已经完成,要么cur == NULL
要么cur != NULL && cur->data == num
.if (cur)
实际上是if (cur != NULL)
的,这意味着cur
包含您正在寻找的价值。
需要块本身来删除找到的元素,方法是将前一个元素的next
指针更改为该元素,该指针位于要删除的元素之后。