[算法通关村] 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` 函数用于释放内存。
### 参考* [链表]( />* [删除链表元素]( />* [删除链表](