Skip to content

双链表 ​

双链表定义 ​

双链表在结点结构体中包含两个指针:

  • 一个指针指向下一个结点位置
  • 另一个指针指向前一个结点位置
cpp
struct Node {
    int data;
    Node* prev;  // 前驱结点指针
    Node* next;  // 后继结点指针
};

双向链表操作 ​

头插法 ​

  1. 将新结点的next指针指向原首结点
  2. 将原首结点的prev指针指向新结点
  3. 将链表指针list指向新结点

尾插法 ​

  1. 找到尾结点位置
  2. 让尾结点的next指针指向新结点
  3. 让新结点的prev指针指向尾结点

中间插入法 ​

  1. 将新结点的prev指针指向临时指针(插入位置前结点)
  2. 将新结点的next指针指向临时指针的next结点
  3. 将临时指针的next指针指向新结点
  4. 将新结点下一个结点的prev指针指向新结点

删除结点 ​

删除首结点:

  1. 将list指针更新到首结点的下一个结点
  2. 释放原首结点
  3. 将新首结点的prev指针置空

删除非首结点:

  1. 将前结点的next指针指向被删结点的下一个结点
  2. 将被删结点下一个结点的prev指针指向前结点
  3. 释放被删结点
cpp
void deleteNode(Node*& head, Node* delNode) {
    if(head == nullptr || delNode == nullptr) return;
    
    // 情况1:删除首结点
    if(head == delNode) {
        head = delNode->next;
        if(head != nullptr) head->prev = nullptr;
    }
    // 情况2:删除中间或尾结点
    else {
        if(delNode->prev != nullptr) 
            delNode->prev->next = delNode->next;
        if(delNode->next != nullptr) 
            delNode->next->prev = delNode->prev;
    }
    
    delete delNode;
}

算法练习平台 ​

作业 ​

将双向链表和单链表封装成模板类,实现以下功能:

cpp
template <typename T>
class DoublyLinkedList {
private:
    struct Node {
        T data;
        Node* prev;
        Node* next;
        Node(T val) : data(val), prev(nullptr), next(nullptr) {}
    };
    
    Node* head;
    Node* tail;
    size_t size;
    
public:
    DoublyLinkedList() : head(nullptr), tail(nullptr), size(0) {}
    
    // 插入操作
    void push_front(T val);
    void push_back(T val);
    void insert(size_t pos, T val);
    
    // 删除操作
    void pop_front();
    void pop_back();
    void erase(size_t pos);
    
    // 访问操作
    T& front();
    T& back();
    T& at(size_t pos);
    
    // 容量操作
    size_t length() const { return size; }
    bool empty() const { return size == 0; }
    
    // 遍历操作
    void traverse() const;
    
    ~DoublyLinkedList() {
        while(head) {
            Node* temp = head;
            head = head->next;
            delete temp;
        }
    }
};

知识如风,常伴吾身