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

来源:互联网 发布:扑克牌喝酒游戏知乎 编辑:程序博客网 时间:2024/05/21 08:42

删除链表结点,根据结点的位置,和链表结点数量可分三种情况
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;    }}