节点删除的这种实现是否有效,或者我的失败?
void remove_node(node *p)
{
node **i = &node_list;
for (;(*i) != NULL && ((*i) != p); *i = ((*i)->next)) ;
if (*i != NULL)
{
(*i) = (*i)->next;
}
if (p != NULL)
{
free(p);
}
}
是的,据我所知,在我看到的每个算法中都删除了列表中的节点,
有一个变量应该保留前一个指针。这种实现缺乏这个......
答案 0 :(得分:2)
没有。它不起作用。 (是的,我知道,我作弊 - 最初我说过它。)
作为面试问题的答案,我首先列出假设:
问题是:
循环将在*i == p
时停止。它需要在*i->next == p
时停止 - 然后它几乎可以工作,但如果p是列表中的第一个节点,仍然会有问题。
答案 1 :(得分:1)
你的计划中的错误是
p
(*i) = (*i)->next
- 这是错误的。应该更新上一个节点的下一个指针。以下更新的逻辑将正常工作
void remove_node(node *p)
{
node *i = node_list;
node *previous_node = NULL;
if((NULL == p) || (NULL == node_list))
{
return;
}
for (; (i != NULL) && (i != p); i = i->next)
{
previous_node = i;
}
if (i != NULL)
{
if(NULL == previous_node) // `p` is the first node
{
node_list = i->next;
free(i);
}
else //`p` is not the first node
{
previous_node->next = i->next;
free(i);
}
}
}
答案 2 :(得分:0)
我认为这会产生node_list
不会指向列表开头的副作用。因此头节点需要存储在其他变量中。
答案 3 :(得分:0)
假设parameter p as pArg
for for循环: -
for (;(*i) != NULL && ((*i) != p); *i = ((*i)->next)) ;
* i = pArg [如果节点pArg存在于链表中](情况1)或* i = NULL(情况2)
首先是: -
if (*i != NULL)
{
(*i) = (*i)->next;
}
p = pArg-> next(案例1)并且(案例2)中没有操作
在第二个之后: -
if (p != NULL)
{
free(p);
}
free(pArg-> next);(案例1);在(案例2)中没有操作(如果pArg确实是LL中的节点)
您删除了pArg指向的节点和而不是pArg 本身。
做一点改变: -
node *prevp=NULL;
for (;(*i) != NULL && ((*i) != p); *i = ((*i)->next))
{prevp=*i;}
if (*i != NULL)
{
prevp->next = (*i)->next;
}