链表的删除和插入一样是链表的重要的操作之一,也是链表相对于顺序表的方便之处。
void deletelinkedlist(LINKED_LIST* list, int index) {
if (index < 0 || index >= list->size) {
printf("INVALID\n");
return;
}
if (index == 0) {
LINK_NODE next = list->head->next;
free(list->head);
list->head = next;
} else {
LINK_NODE current = list->head;
for (int i = 0; i < index-1; i++) { // 循环应该到达要删除的节点的前一个节点
current = current->next; // 移动到下一个节点
}
LINK_NODE temp = current->next; // temp 指向要删除的节点
current->next = temp->next; // 更新 current 的 next 指针以跳过 temp 指向的节点
free(temp); // 释放要删除的节点内存空间
}
list->size--; // 更新链表大小信息
}
如果没看过之前的插入操作的uu可以去看看之前有图的插入操作详解,这里有了插入的基础,删除理解起来就更加容易一些。
首先还是对下标的合法性进行判断,然后先定义一个操作指针current来遍历链表,定义next指针为current->next->next。这里的current相当于是要被删除的节点的前驱的地址,current->next(temp)相当于是待删除节点的地址,current->next->next(temp->next)相当于是待删除节点的后继的地址,我们要做的首先是把temp->next赋值给current->next,然后,把待删除节点(也就是NODE index)的内存给释放掉,也就是把前驱和后继连接起来,这样就好了。注意,由于要释放内存,因此要先把后继的地址current->next->next存储到新的变量里面,并且先对待删除节点进行操作。
这样就完成了一次链表的删除过程。哦,最后别忘了把链表的长度减一和对index=0进行单独讨论。