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