笔试题之单向链表的三种删除方式

  • 方式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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值