如何在不知道头节点的情况下删除链表中的某一指定节点?

单链表不可能完全实现

传统解法一:将待删节点后续节点Copy至待删节点,删除后续节点。
存在问题:当指定节点为链表最后一个节点时,无法删除。

传统解法二:将待删节点的内存指向NULL。
存在问题:NULL在系统上是一个特定的区域,如果想让待删节点的先续节点指向NULL,必须找到该节点,否则等同于改变了待删节点的值而删除了待删节点的后续节点。

双向链表实现

linker_p   delete_Node(linker_p  Head,int   pos)
{
    int        i = 1;
    linker_p   Np_now = Head;
    linker_p   p;
   
    if(Head->prev == NULL && Head->next == NULL)
    {
        printf("Delete No.%d data is %d success\n",i,Head->data);
        free(Np_now);
        Head->prev = NULL;
        Head->next = NULL;
        return  Head;    
    }
 
    while(Np_now != NULL)
    {
        if(i == pos-1)
        {
            p = Np_now->next;
            Np_now->next = Np_now->next->next;
            Np_now->next->prev = Np_now;
            printf("Delete No.%d data is %d success\n",i+1,p->data);
            free(p);
            return  Head;
        }
        else
        {
            Np_now = Np_now->next;
            i++;
        }
    }
 
    printf("Delete error : Cannot find this position %d \n\n",pos);
 
    return   Head;
}

你可能感兴趣的:(数据结构与算法)