📌  相关文章
📜  数据结构示例-双向链表删除中间一个节点(1)

📅  最后修改于: 2023-12-03 15:10:20.654000             🧑  作者: Mango

双向链表

双向链表是指在每个节点中不仅包含其后继节点的地址,还包含其前驱节点的地址。

双向链表的优点:

  • 可以实现双向遍历
  • 可以快速删除前驱或后继节点

双向链表的缺点:

  • 每个节点需要额外存储一个指针,占用内存空间较大
  • 每次插入或删除节点需要更新前驱和后继节点的指针,增加了复杂度
双向链表删除节点

删除双向链表中的一个节点需要进行以下几个步骤:

  1. 找到需要删除的节点
  2. 修改其前驱节点的后继指针,使其指向其后继节点
  3. 修改其后继节点的前驱指针,使其指向其前驱节点
  4. 释放被删除节点的内存空间
代码实现

以下是双向链表删除中间一个节点的C++代码实现:

#include<iostream>
using namespace std;
struct Node{
    int data;
    Node* prev;
    Node* next;
    Node(int x){
        data = x;
        prev = NULL;
        next = NULL;
    }
};
void deleteNode(Node* curr){
    if(curr == NULL || curr->next == NULL) return; // 如果当前节点为空或下个节点为空,则无法进行删除操作
    Node* prev = curr->prev;
    Node* next = curr->next;
    prev->next = next; // 修改前驱节点的后继指针
    next->prev = prev; // 修改后继节点的前驱指针
    delete curr; // 释放被删除节点的内存空间
}
int main(){
    Node* head = new Node(-1);
    Node* temp1 = new Node(10);
    Node* temp2 = new Node(20);
    Node* temp3 = new Node(30);
    head->next = temp1;
    temp1->prev = head;
    temp1->next = temp2;
    temp2->prev = temp1;
    temp2->next = temp3;
    temp3->prev = temp2;
    cout<<"双向链表中的节点为:"<<endl;
    Node* curr = head;
    while(curr->next != NULL){
        curr = curr->next;
        cout<<curr->data<<" ";
    }
    cout<<endl;
    deleteNode(temp2); // 删除中间的节点20
    cout<<"删除节点后的双向链表中的节点为:"<<endl;
    curr = head;
    while(curr->next != NULL){
        curr = curr->next;
        cout<<curr->data<<" ";
    }
    cout<<endl;
    return 0;
}

以上代码片段使用C++语言实现了双向链表的删除操作,输入的双向链表为{ 10 <-> 20 <-> 30 },删除中间节点20后,新双向链表为{ 10 <-> 30 }。