C++笔记-数据结构

单链表 

class MList {
    struct Node {
        int value;
        Node* next;
        Node() :value(0), next(NULL) {}
        Node(int val) :value(val), next(NULL) {}
    };
public:
    MList() :head(NULL), tail(NULL), size(0) {}
    ~MList() {
        Node* tmp = head;
        while (tmp) {
            Node* delete_ptr = tmp;
            tmp = tmp->next;
            delete delete_ptr;
        }
    }
    // 打印list中的值
    void Print() {
        Node* tmp = head;
        while (tmp) {
            cout << tmp->value << endl;
            tmp = tmp->next;
        }
    }
    // 翻转
    void Reverse() {
        Node* next = NULL;
        Node* pre = NULL;
        while (head) {
            Node* next = head->next;
            head->next = pre;
            pre = head;
            head = next;
        }
        head = pre;
    }
    // 删除单链表中value等于num的节点;
    void RemoveValue(int num) {
        Node* tmp = NULL;
        while (head) {
            if (head->value == num) {
                tmp = head->next;
                delete head;
                head = tmp;
                size--;
            }
            else {
                break;
            }
        }

        while (tmp->next != NULL) {
            if (tmp->next->value == num) {
                Node* next = tmp->next;
                tmp->next = next->next;
                delete next;
                size--;
            }
            else {
                tmp = tmp->next;
            }
        }
    }
    // 删除第index位置的节点
    void RemoveNodeByIndex(int index) {
        if (index < 0 || index >= size) {
            return;
        }

        if (index == 0) {
            Pop_Front();
        }
        else if (index == size - 1) {
            Pop_Back();
        }
        else {
            Node* tmp = head;
            int count = 0;
            while (tmp && count != index - 1) {
                tmp = tmp->next;
            }

            Node* delete_ptr = tmp->next;
            tmp->next = delete_ptr->next;
            delete delete_ptr;
            size--;
        }
    }
    // 生成一个随机list,个数为number,每个节点的值都是随机数;
    static void GenerateRandomList(MList& my_list, int number) {
        uniform_int_distribution<unsigned> u(0, 20);
        default_random_engine e;            // 生成无符号随机整数
        e.seed(time(NULL));
        my_list.size = number;
        while (number-- > 0) {
            my_list.Push_Back(u(e));
        }
    }
    // 在list尾部增加一个节点,其值为val;
    void Push_Back(int val) {
        size++;
        if (tail == NULL && head == NULL) {
            head = new Node(val);
            tail = head;
            return;
        }
        tail->next = new Node(val);
        tail = tail->next;
    }
    // 在头部插入一个val值的节点;
    void Push_Front(int val) {
        size++;
        if (tail == NULL && head == NULL) {
            head = new Node(val);
            tail = head;
            return;
        }
        Node* tmp = new Node(val);
        tmp->next = head;
        head = tmp;
    }
    // 弹出头部的节点;
    Node Pop_Front() {
        if (size == 0) {
            throw - 1;
        }
        size--;
        Node ret = *head;
        Node* delete_ptr = head;
        head = head->next;
        delete delete_ptr;
        return ret;
    }
    // 弹出尾部的节点
    Node Pop_Back() {
        if (size == 0) {
            throw - 1;
        }
        size--;
        Node* pre = head;
        while (pre->next != tail) {
            pre = pre->next;
        }
        pre->next = NULL;
        Node ret = *tail;               
        delete tail;
        tail = pre;
        return ret;
    }
    // 返回list内节点的个数
    int Size() { return size; }
    bool Empty() { return Size() == 0; }
private:
    Node* head;
    Node* tail;
    int size;
};

队列

class MQueue {
public:
    void Push_front(int val) {
        node_list.Push_Front(val);
    }
    void Push_back(int val) {
        node_list.Push_Back(val);
    }
    MList::Node Pop_front() {
        return node_list.Pop_Front();
    }
    MList::Node Pop_back() {
        return node_list.Pop_Back();
    }
    bool Empty() {
        return node_list.Empty();
    }
    int Size() {
        return node_list.Size();
    }
private:
    MList node_list;
};

二叉树

class MBTree {
    struct Node {
        int val;
        Node* right;
        Node* left;
        Node() :val(0), left(nullptr), right(nullptr) {}
        Node(int val, Node* left, Node* right) :val(val), left(left), right(right) {}
    };
public:
    // 有序数组转换为二叉平衡树
    static Node* sortedArrayToBST(vector<int>& nums) {
        if (nums.size() == 0) {
            return nullptr;
        }
        if (nums.size() == 1) {
            return new Node(nums.at(0), nullptr, nullptr);
        }

        int mid    = nums.size() / 2;
        Node* head = new Node(nums[mid], nullptr, nullptr);
        vector<int> left_nums(nums.begin(), nums.begin() + mid);
        vector<int> right_nums(nums.begin() + mid + 1, nums.end());
        head->left  = sortedArrayToBST(left_nums);
        head->right = sortedArrayToBST(right_nums);
        return head;
    }
private:
    Node* head;
};


版权声明:本文为liushao1031177原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。