面试:删除链表中的节点

时间:2012-08-25 10:23:30

标签: c linked-list

节点删除的这种实现是否有效,或者我的失败?

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);
    }
}
是的,据我所知,在我看到的每个算法中都删除了列表中的节点, 有一个变量应该保留前一个指针。这种实现缺乏这个......

4 个答案:

答案 0 :(得分:2)

没有。它不起作用。 (是的,我知道,我作弊 - 最初我说过它。)

作为面试问题的答案,我首先列出假设:

  • node_list开始有效(并且正确地为NULL终止)
  • 这是一个单链表
  • 节点是动态分配的

问题是: 循环将在*i == p时停止。它需要在*i->next == p时停止 - 然后它几乎可以工作,但如果p是列表中的第一个节点,仍然会有问题。

答案 1 :(得分:1)

你的计划中的错误是

  1. 头部指针(node_list)不会指向第一个元素,它会指向p
  2. 旁边的元素
  3. (*i) = (*i)->next - 这是错误的。应该更新上一个节点的下一个指针。
  4. 以下更新的逻辑将正常工作

    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;
    }