删除链表结点O(1)时间

删除链表结点,根据结点的位置,和链表结点数量可分三种情况
1.删除非尾结点,链表的结点数量 >= 2
2.删除只有一个结点的链表,结点数量 == 1
3.删除尾结点,结点数量 >= 2
当然,上面这个3中情况都是已经确定要删除结点在链表中,这个我在delete_node函数内没有做处理,而是把这个问题抛给了delete_node函数的调用者,因为要保证O(1)时间完成删除结点,那么久必须这么干。

C语言代码:

typedef struct list_node{
    int value;
    struct list_node *next;
}list_node;

void delete_node(list_node** list_head, list_node* to_be_deleted)
{
    if (!list_head || !to_be_deleted)
        return;

    // 1.delete not tail node
    if (to_be_deleted->next != NULL){
        list_node *next = to_be_deleted->next;
        to_be_deleted->value = next->value;
        to_be_deleted->next = next->next;

        free(next);
        next = NULL;    
    }
    // 2.delete only one node list
    else if (*list_head == to_be_deleted){
        free(to_be_deleted);
        to_be_deleted = NULL;
        *list_head = NULL;
    }
    // 3.delete tail node in list that have more than one node
    else{
        list_node *node = *list_head;
        while(node->next != to_be_deleted)
            node = node->next;
        node->next = NULL;
        free(to_be_deleted);
        to_be_deleted = NULL;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值