数据结构学习系列之单向链表的三种删除方式

  • 方式1:
  • 删除单向链表头结点后的结点,即头删法,代码如下:
  • 示例代码:
int delete_link_list_1(node_t *phead){
    
    

    if(NULL == phead){
    
    

        printf("入参为NULL\n");

        return -1;

    }

    if(NULL == phead->next){
    
    


        printf("链表只有一个头结点,无其他的结点\n");

        return -1;

    }

    node_t *pdel = phead->next;

    phead->next = pdel->next;

    free(pdel);

    pdel = NULL;

    return 0;

}
  • 操作步骤:
  • 1.定义待删结点pdel,并将头结点的指针域指向待删结点的地址,即node_t *pdel = phead->next
  • 2.待删结点后的结点的地址指向头结点的指针域,即phead->next = pdel->next
  • 3.用free函数释放待删结点所占用的空间,即 free(pdel)
  • 4.防止野指针产生,给待删结点的地址赋值NULL,即pdel = NULL
  • 方式2:
  • 删除单向链表的最后一个结点,即尾删法,代码如下:
  • 示例代码:
int delete_link_list_2(node_t *phead){
    
    

    if(NULL == phead){
    
    


        printf("入参为NULL\n");

        return -1;

    }

    if(NULL == phead->next){
    
    


        printf("链表只有一个头结点,无其他的结点\n");

        return -1;

    }

    //遍历链表,找到倒数第二个结点

    node_t *ptemp = phead;

    while(NULL != ptemp->next->next){
    
    

        ptemp = ptemp->next;

    }
    free(ptemp->next);

    ptemp->next = NULL;

    return 0;

}
  • 操作步骤:

  • 1.利用while循环,遍历单向链表,找到倒数第二个结点,即ptemp

  • 2.释放ptemp的指针域,并赋值NULL,这样就删除了链表的最后一个结点;

  • 方式3:

  • 指定结点在链表中的位置,然后根据位置,删除待删结点,代码如下:

  • 示例代码:

int delete_link_list_3(node_t *phead,int pos){
    
    

    if(NULL == phead){
    
    


        printf("入参为NULL\n");

        return -1;

    }

    if(NULL == phead->next){
    
    


        printf("链表只有一个头结点,无其他的结点\n");

        return -1;

    }

    if(pos < 0){
    
    

        printf("删除位置不合理,删除失败\n");

        return -1;

    }
    node_t *ptemp = phead;

    int i = 0;

    for(i = 0; i < pos; i++){
    
    

        ptemp = ptemp->next;


        if(NULL == ptemp->next){
    
    

            break;

        }
        
        

    }
    if(i < pos){
    
    

        printf("删除位置不合理,删除失败\n");

        return -1;


    }
    node_t *pdel = ptemp->next;

    ptemp->next = pdel->next;

    free(pdel);

    pdel = NULL;

    return 0;

}

  • 操作步骤:
  • 1.找到待删结点的前一个结点ptemp;
  • 2.定义待删结点,让待删结点前一个结点的指针域指向待删结点地址,备份待删结点,即node_t *pdel = ptemp->next
  • 3.待删结点的指针域指向待删结点前一个结点的指针域,也就是待删结点后面那个结点的地址指向待删结点前一个结点的指针域,即ptemp->next = pdel->next
  • 4.用free函数释放待删结点所占用的空间,即 free(pdel)
  • 5.防止野指针产生,给待删结点的地址赋值NULL,即pdel = NULL

猜你喜欢

转载自blog.csdn.net/qq_41878292/article/details/132651978