如何在不知道頭節點的情況下刪除鏈表中的某一指定節點?

單鏈表不可能完全實現

傳統解法一:將待刪節點後續節點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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章