【数据结构】双向链表中删除节点的方法实现(代码+详解)

简介: 【数据结构】双向链表中删除节点的方法实现(代码+详解)

【数据结构】双向链表中删除节点方法的实现(代码+详解)

分析

💕 在双向链表中,删除一个结点可能出现以下几种情况,取决于待删除的结点在链表中的位置:

  1. 删除头结点:
  • 如果待删除的结点是头结点,需要特殊处理,更新头结点为原头结点的后继结点,并释放原头结点的内存。
  1. 删除尾结点:
  • 如果待删除的结点是尾结点,需要特殊处理,更新尾结点为原尾结点的前驱结点,并释放原尾结点的内存。
  1. 删除中间结点:
  • 如果待删除的结点位于链表的中间位置,只需调整前驱结点和后继结点的指针,将它们连接在一起,并释放待删除结点的内存。

💕 这些情况可以进一步细分为以下几类:

  • 删除头结点
  • 头结点是唯一结点
  • 头结点后还有其他结点
  • 删除尾结点
  • 尾结点是唯一结点
  • 尾结点前还有其他结点
  • 删除中间结点

代码

#include <stdio.h>
#include <stdlib.h>
// 定义双向链表的结点结构
typedef struct Node {
    int data;
    struct Node* prev;  // 前驱指针
    struct Node* next;  // 后继指针
} Node;
// 删除双向链表的头结点
Node* deleteHead(Node* head) {
    if (head == NULL) {
        printf("Error: Empty list\n");
        return NULL;
    }
    Node* newHead = head->next;
    if (newHead != NULL) {
        newHead->prev = NULL;
    }
    free(head);
    printf("Head node deleted successfully.\n");
    return newHead;
}
// 删除双向链表的尾结点
Node* deleteTail(Node* head) {
    if (head == NULL) {
        printf("Error: Empty list\n");
        return NULL;
    }
    if (head->next == NULL) {
        free(head);
        printf("Tail node (and the only node) deleted successfully.\n");
        return NULL;
    }
    Node* current = head;
    while (current->next->next != NULL) {
        current = current->next;
    }
    free(current->next);
    current->next = NULL;
    printf("Tail node deleted successfully.\n");
    return head;
}
// 删除双向链表的中间结点
Node* deleteMiddle(Node* head, int target) {
    if (head == NULL) {
        printf("Error: Empty list\n");
        return NULL;
    }
    Node* current = head;
    while (current != NULL && current->data != target) {
        current = current->next;
    }
    if (current == NULL) {
        printf("Error: Node with data %d not found in the list\n", target);
        return head;
    }
    if (current->prev != NULL) {
        current->prev->next = current->next;
    }
    if (current->next != NULL) {
        current->next->prev = current->prev;
    }
    free(current);
    printf("Node with data %d deleted successfully.\n", target);
    return head;
}
// 打印双向链表的内容
void printList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}
int main() {
    // 创建一个简单的双向链表:1 <-> 2 <-> 3 <-> 4
    Node* head = (Node*)malloc(sizeof(Node));
    head->data = 1;
    head->prev = NULL;
    head->next = (Node*)malloc(sizeof(Node));
    head->next->data = 2;
    head->next->prev = head;
    head->next->next = (Node*)malloc(sizeof(Node));
    head->next->next->data = 3;
    head->next->next->prev = head->next;
    head->next->next->next = (Node*)malloc(sizeof(Node));
    head->next->next->next->data = 4;
    head->next->next->next->prev = head->next->next;
    head->next->next->next->next = NULL;
    printf("Original list: ");
    printList(head);
    // 删除头结点
    head = deleteHead(head);
    printf("List after deleting head: ");
    printList(head);
    // 删除尾结点
    head = deleteTail(head);
    printf("List after deleting tail: ");
    printList(head);
    // 删除中间结点(例如,删除值为3的结点)
    head = deleteMiddle(head, 3);
    printf("List after deleting middle node: ");
    printList(head);
    return 0;
}

目录
相关文章
|
23小时前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
7天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
16 1
|
17天前
|
存储 Java
HashMap之链表转红黑树(树化 )-treefyBin方法源码解读(所有涉及到的方法均有详细解读,欢迎指正)
本文详细解析了Java HashMap中链表转红黑树的机制,包括树化条件(链表长度达8且数组长度≥64)及转换流程,确保高效处理大量数据。
49 1
|
14天前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
16 0
|
17天前
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
25 0
|
19天前
|
存储
探索数据结构:便捷的双向链表
探索数据结构:便捷的双向链表
|
19天前
|
存储
探索数据结构:单链表的实践和应用
探索数据结构:单链表的实践和应用
|
20天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
18 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
23小时前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!