zoukankan      html  css  js  c++  java
  • PapaMelon #5 设计单向链表

    题目链接

    题解

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <cassert>
    
    using namespace std;
    
    const vector<string> OP = {
        "PUSH_FRONT", "POP_FRONT", "INSERT",  "CONTAINS",
        "REMOVE",     "REVERSE",   "FOR_EACH"};
    
    struct Node {
        int val;
        Node* next;
        Node(): val(-1), next(nullptr) {}
        Node(int x): val(x), next(nullptr) {}
    };
    
    struct List {
        Node* head;
    
        List() {
            head = new Node();
        }
    
        ~List() {
            clear();
            delete head;
        }
    
        void clear() {
            while (head->next) {
                Node* ptr = head->next->next;
                head->next->next = nullptr;
                delete head->next;
                head->next = ptr;
            }
        }
    
        void push_front(int x) {
            Node* ptr = head->next;
            Node* node = new Node(x);
            node->next = ptr;
            head->next = node;
        }
    
        void pop_front() {
            Node* node = head->next;
            if (!node) return;
            head->next = node->next;
            node->next = nullptr;
            delete node;
        }
    
        void insert(int index, int x) {
            Node* ptr = head->next;
            Node* pre = head;
            for (int i = 0; i < index; i++) {
                pre = ptr;
                ptr = ptr->next;
            }
            Node* node = new Node(x);
            pre->next = node;
            node->next = ptr;
        }
    
        bool contains(int x) {
            Node* ptr = head->next;
            while (ptr && ptr->val != x) ptr = ptr->next;
            return ptr != nullptr;
        }
    
        void remove(int x) {
            Node* pre = head;
            Node* ptr = head->next;
    
            while (ptr) {
                if (ptr->val == x) {
                    pre->next = ptr->next;
                    ptr->next = nullptr;
                    delete ptr;
                    ptr = pre->next;
                } else {
                    pre = ptr;
                    ptr = ptr->next;
                }
            }
        }
    
        void reverse() {
            Node* pre = nullptr;
            Node* ptr = head->next;
            while (ptr) {
                Node* node = ptr->next;
                ptr->next = pre;
                pre = ptr;
                ptr = node;
            }
            head->next = pre;
        }
    
        void foreach() {
            Node* ptr = head->next;
            for (int i = 0; ptr; i++, ptr = ptr->next) {
                if (i) cout << " ";
                cout << ptr->val;
            }
            cout << endl;
        }
    
    };
    
    List data;
    
    void lpushfront() {
        int x;
        cin >> x;
        data.push_front(x);
    }
    
    void lpopfront() {
        data.pop_front();
    }
    
    void linsert() {
        int index, x;
        cin >> index >> x;
        // auto it = data.begin();
        // for (int i = 0; i < index; i++) it++;
        // data.insert(it, x);
        data.insert(index, x);
    }
    
    void lcontains() {
        int x;
        cin >> x;
        bool ret = data.contains(x);
        if (ret) cout << "true" << endl;
        else cout << "false" << endl;
    }
    
    void lremove() {
        int x;
        cin >> x;
        data.remove(x);
    }
    
    void lreverse() {
        data.reverse();
    }
    
    void lforeach() {
        data.foreach();
    }
    
    void solve() {
        int M;
        cin >> M;
        
        data.clear();
        while (M--) {
            string op;
            cin >> op;
            int id = find(OP.begin(), OP.end(), op) - OP.begin();
    
            switch (id) {
                case 0:
                    lpushfront();
                    break;
                case 1:
                    lpopfront();
                    break;
                case 2:
                    linsert();
                    break;
                case 3:
                    lcontains();
                    break;
                case 4:
                    lremove();
                    break;
                case 5:
                    lreverse();
                    break;
                case 6:
                    lforeach();
                    break;
                default:
                    assert(0);
            }
        }
    }
    
    int main() {
        solve();
        return 0;
    }
    
    
  • 相关阅读:
    30分钟掌握ES6/ES2015核心内容(下)
    30分钟掌握ES6/ES2015核心内容(上)
    域名、主机名与URL
    localstorage sessionstorage cookie的区别
    http中post 和 get 请求方法区别
    leetcode33. 搜索旋转排序数组
    leetcode 56. 合并区间
    MySQL EXPLAIN
    array 数组
    判断一个字符串的所有字符是否都在另一个字符串中
  • 原文地址:https://www.cnblogs.com/scau20110726/p/15002810.html
Copyright © 2011-2022 走看看