xd96dx Docs
  • c/c++
    • 网络编程
      • linux 网络
        • linux 网络io模型
        • Signal-Driven I/O Model(信号驱动)
        • Asynchronous I/O Model(异步IO)
      • IO多路复用
        • select 示例
        • poll 示例
        • epoll 示例
      • Reactor实例之 muduo 源码分析
    • stl实现
      • 容器(Containers)
        • Vector(动态数组)
        • List(双向链表)
        • Deque(二级动态数组)
  • 游戏开发
    • skynet 从demo到源码
      • server-client demo
      • skynet 源码分析-启动流程之初始化
      • skynet 源码分析-启动流程之创建service
      • skynet 源码分析-启动流程之线程池启动
Powered by GitBook
On this page
  1. c/c++
  2. stl实现
  3. 容器(Containers)

List(双向链表)

#include <iostream>
#include <stdexcept>

namespace XD
{
    template <typename T>
    class List {
    private:
        struct Node {
            T data;
            Node* prev;
            Node* next;

            Node(const T& value) : data(value), prev(nullptr), next(nullptr) {}
        };

        Node* head;  // 指向链表头部
        Node* tail;  // 指向链表尾部
        size_t size; // 链表的大小

    public:
        List() : head(nullptr), tail(nullptr), size(0) {}

        ~List() {
            clear();
        }

        // 添加到链表尾部
        void push_back(const T& value) {
            Node* newNode = new Node(value);
            if (tail) {
                tail->next = newNode;
                newNode->prev = tail;
                tail = newNode;
            }
            else {
                head = tail = newNode;
            }
            ++size;
        }

        // 添加到链表头部
        void push_front(const T& value) {
            Node* newNode = new Node(value);
            if (head) {
                head->prev = newNode;
                newNode->next = head;
                head = newNode;
            }
            else {
                head = tail = newNode;
            }
            ++size;
        }

        // 删除链表尾部元素
        void pop_back() {
            if (!tail) throw std::out_of_range("List is empty");
            Node* temp = tail;
            tail = tail->prev;
            if (tail) {
                tail->next = nullptr;
            }
            else {
                head = nullptr;
            }
            delete temp;
            --size;
        }

        // 删除链表头部元素
        void pop_front() {
            if (!head) throw std::out_of_range("List is empty");
            Node* temp = head;
            head = head->next;
            if (head) {
                head->prev = nullptr;
            }
            else {
                tail = nullptr;
            }
            delete temp;
            --size;
        }

        // 反转
        void reverse() {
            if (!head || !head->next) {
                // 空链表直接返回
                return;
            }

            Node* current = head;
            Node* temp = nullptr;

            while (current) {
                temp = current->prev;
                current->prev = current->next;
                current->next = temp;
                current = current->prev;
            }

            temp = head;
            head = tail;
            tail = temp;
        }

        // 清空链表
        void clear() {
            while (head) {
                pop_front();
            }
        }

        // 获取链表大小
        size_t get_size() const {
            return size;
        }

        // 检查链表是否为空
        bool empty() const {
            return size == 0;
        }

        // 打印链表内容
        void print_() const {
            Node* current = head;
            while (current) {
                std::cout << current->data << " ";
                current = current->next;
            }
            std::cout << std::endl;
        }
    };
}

主要写了链表算法相关的, 构造的部分和注意的点, 跟vector差不多

PreviousVector(动态数组)NextDeque(二级动态数组)

Last updated 4 months ago