C语言双向循环链表删除节点函数 - deleteNode()详解
void deleteNode(Node** head, int data) {\n if (head == NULL) { // 如果头指针是空的,说明链表为空\n printf("List is empty.\n"); // 打印链表为空的提示信息\n return; // 返回\n }\n\n Node current = head; // 创建一个指针current指向头指针\n Node prevNode = NULL; // 创建一个指针prevNode指向空\n\n while (current->data != data) { // 当指针current指向的节点的数据不等于要删除的数据时\n if (current->next == *head) { // 如果指针current的下一个节点指向头指针,说明遍历完了整个链表还没找到要删除的节点\n printf("Element %d not found in the list.\n", data); // 打印未找到要删除节点的提示信息\n return; // 返回\n }\n prevNode = current; // 把指针current赋值给指针prevNode\n current = current->next; // 把指针current指向下一个节点\n }\n\n if (current->next == *head && prevNode == NULL) { // 如果指针current的下一个节点指向头指针,并且指针prevNode为空,说明要删除的节点是头节点且链表只有一个节点\n *head = NULL; // 把头指针设置为空\n free(current); // 释放要删除的节点的内存\n return; // 返回\n }\n\n if (current == *head) { // 如果指针current指向的节点是头节点\n prevNode = (*head)->prev; // 把头节点的前一个节点赋值给指针prevNode\n *head = (*head)->next; // 把头节点的下一个节点赋值给头指针\n prevNode->next = *head; // 把指针prevNode的下一个节点指向头指针\n (*head)->prev = prevNode; // 把头指针的前一个节点指向指针prevNode\n free(current); // 释放要删除的节点的内存\n } else if (current->next == *head) { // 如果指针current的下一个节点指向头指针,说明要删除的节点是尾节点\n prevNode->next = *head; // 把指针prevNode的下一个节点指向头指针\n (head)->prev = prevNode; // 把头指针的前一个节点指向指针prevNode\n free(current); // 释放要删除的节点的内存\n } else { // 如果以上情况都不满足,说明要删除的节点是中间节点\n Node temp = current->next; // 创建一个指针temp指向指针current的下一个节点\n prevNode->next = temp; // 把指针prevNode的下一个节点指向指针temp\n temp->prev = prevNode; // 把指针temp的前一个节点指向指针prevNode\n free(current); // 释放要删除的节点的内存\n }\n}
原文地址: https://www.cveoy.top/t/topic/pO6U 著作权归作者所有。请勿转载和采集!