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

  • 方式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

你可能感兴趣的:(数据结构学习系列,数据结构,学习,链表,青少年编程,算法,c语言)