当前位置:实例文章 » 其他实例» [文章][算法通关村] 1.3 链表的删除

[算法通关村] 1.3 链表的删除

发布人:shili8 发布时间:2025-02-28 09:48 阅读次数:0

**链表的删除**

在链表中,删除一个元素通常涉及到修改指针的指向。链表的删除可以分为两种情况:删除头结点和删除非头结点。

###1. 删除头结点删除头结点是最简单的情况,因为我们只需要改变 `head` 指针的指向即可。

c// 删除头结点void deleteHead(Node** head) {
 if (*head == NULL || (*head)->next == NULL) return;
 Node* temp = *head;
 *head = (*head)->next;
 free(temp);
}


在上面的代码中,我们首先检查链表是否为空或只有一个元素。如果是,则直接返回。否则,我们将 `head` 指针指向下一个结点,并释放原来的头结点。

###2. 删除非头结点删除非头结点稍微复杂一些,因为我们需要找到要删除的结点的前驱结点,然后改变前驱结点的 next 指针。

c// 删除非头结点void deleteNode(Node** head, int value) {
 if (*head == NULL || (*head)->data != value) return;
 Node* temp = *head;
 if ((*head)->next == NULL && (*head)->data == value) {
 free(*head);
 *head = NULL;
 return;
 }
 if ((*head)->data == value) {
 *head = (*head)->next;
 free(temp);
 return;
 }
 Node* prev = *head;
 while (prev->next != NULL && prev->next->data != value) {
 prev = prev->next;
 }
 if (prev->next != NULL) {
 Node* temp = prev->next;
 prev->next = prev->next->next;
 free(temp);
 }
}


在上面的代码中,我们首先检查链表是否为空或要删除的结点不存在。如果是,则直接返回。否则,我们找到要删除的结点的前驱结点,然后改变前驱结点的 next 指针,并释放原来的结点。

###3. 删除链表如果我们需要删除整个链表,可以使用以下代码:

c// 删除链表void deleteList(Node** head) {
 Node* temp = *head;
 while (temp != NULL) {
 Node* next = temp->next;
 free(temp);
 temp = next;
 }
 *head = NULL;
}


在上面的代码中,我们首先检查链表是否为空。如果是,则直接返回。否则,我们从头结点开始遍历链表,释放每个结点,并将其指针设置为 NULL。

### 总结删除链表的元素涉及到修改指针的指向。在链表中,删除一个元素通常需要找到要删除的结点的前驱结点,然后改变前驱结点的 next 指针。链表的删除可以分为两种情况:删除头结点和删除非头结点。如果我们需要删除整个链表,可以使用上面的代码。

### 示例
cint main() {
 Node* head = NULL;
 // 创建链表 for (int i =0; i < 5; i++) {
 Node* node = malloc(sizeof(Node));
 node->data = i;
 node->next = head;
 head = node;
 }
 // 打印链表 Node* temp = head;
 while (temp != NULL) {
 printf("%d ", temp->data);
 temp = temp->next;
 }
 printf("
");
 // 删除头结点 deleteHead(&head);
 // 打印链表 temp = head;
 while (temp != NULL) {
 printf("%d ", temp->data);
 temp = temp->next;
 }
 printf("
");
 // 删除非头结点 deleteNode(&head,2);
 // 打印链表 temp = head;
 while (temp != NULL) {
 printf("%d ", temp->data);
 temp = temp->next;
 }
 printf("
");
 // 删除链表 deleteList(&head);
 return0;
}


在上面的代码中,我们首先创建一个链表,然后打印它。接着,我们删除头结点、非头结点和整个链表,最后再次打印它们。

### 注释* `deleteHead` 函数用于删除链表的头结点。
* `deleteNode` 函数用于删除链表中的一个元素。
* `deleteList` 函数用于删除整个链表。
* `malloc` 函数用于分配内存。
* `free` 函数用于释放内存。

### 参考* [链表]( />* [删除链表元素]( />* [删除链表](

相关标签:算法链表数据结构
其他信息

其他资源

Top