#include <assert.h>
#include <iostream>
#include <memory>
 
using namespace std;
 
struct List {
    struct LNode {
        int data;
        struct LNode *next;
    };
    LNode *head_ptr;
 
    List() { head_ptr = nullptr; }
 
    ~List() {
        if (head_ptr == nullptr) {
            return;
        }
        LNode *current = head_ptr;
        do {
            LNode *tmp = current;
            current = current->next;
            free(tmp);
        } while (current != head_ptr);
    }
 
    void insert(int value) {
        LNode *node = static_cast<LNode *>(malloc(sizeof(LNode)));
        assert(node != nullptr);
        node->data = value;
        if (head_ptr == nullptr) {
            head_ptr = node;
            node->next = head_ptr;
            return;
        }
        LNode *tail = head_ptr;
        // 采用尾插法使得顺序输出
        while (tail->next != head_ptr) {
            tail = tail->next;
        }
        tail->next = node;
        node->next = head_ptr;
    }
 
    void erase_ifeq(int value) {
        if (head_ptr == nullptr) {
            return;
        }
        // Start from the 2ne node
        LNode *current = head_ptr->next;
        LNode *prev = head_ptr;
 
        while (current != head_ptr) {
            if (current->data != value) {
                prev = current;
                current = current->next;
                continue;
            }
            prev->next = current->next;
            free(current);
            current = prev->next; // Move to next node
        }
        if (current->data != value) {
            return;
        }
        if (current->next = current) { // Only one remain
            free(head_ptr);
            head_ptr = nullptr;
            return;
        }
        head_ptr = prev->next = current->next;
        free(current);
    }
 
    void print() {
        if (head_ptr == nullptr) {
            cout << "empty!" << endl;
            return;
        }
        LNode *current = head_ptr;
        do {
            cout << current->data << " ";
            current = current->next;
        } while (current != head_ptr);
        cout << endl;
    }
};
 
int main() {
    List list;
    list.print();
    list.insert(1);
    list.insert(1);
    list.insert(1);
    list.insert(1);
    list.print();
    list.insert(2);
    list.print();
    list.erase_ifeq(1);
    list.print();
}
#include <bits/stdc++.h>
 
using namespace std;
 
const int MAX_SIZE = 30;
 
void erase_n_from(int table[MAX_SIZE], int num, int index) {
    while (index < MAX_SIZE) {
        if (index + num >= MAX_SIZE) {
            table[index++] = 0;
            continue;
        }
        table[index++] = table[index + num];
    }
}
 
void show(int table[MAX_SIZE]) {
    for (size_t i = 0; i < MAX_SIZE; i++) {
        cout << table[i] << " ";
    }
    cout << endl;
}
 
int main() {
    int table[MAX_SIZE] = {3,   2, 5, 6,  7, 54, 3, 6, 7,  9, 99, 7,  6, 45, 4,
                           334, 5, 5, 56, 5, 5,  5, 5, 55, 5, 3,  33, 3, 3,  3};
    show(table);
    erase_n_from(table, 33, 15);
    show(table);
}
#include <bits/stdc++.h>
 
using namespace std;
 
template <typename T> class Node {
  public:
    T data;
    Node *next;
    Node *prev;
 
    Node(T value) : data(value), next(nullptr), prev(nullptr) {}
};
 
template <typename T> class DoublyCircularLinkedList {
  private:
    Node<T> *head;
 
  public:
    DoublyCircularLinkedList() : head(nullptr) {}
 
    ~DoublyCircularLinkedList() {
        if (head) {
            Node<T> *current = head;
            do {
                Node<T> *nextNode = current->next;
                delete current;
                current = nextNode;
            } while (current != head);
        }
    }
 
    void append(T value) {
        Node<T> *newNode = new Node<T>(value);
        if (!head) {
            head = newNode;
            head->next = head;
            head->prev = head;
        } else {
            Node<T> *tail = head->prev;
            tail->next = newNode;
            newNode->prev = tail;
            newNode->next = head;
            head->prev = newNode;
        }
    }
 
    void display() const {
        if (!head)
            return;
        Node<T> *current = head;
        do {
            std::cout << current->data << " ";
            current = current->next;
        } while (current != head);
        std::cout << std::endl;
    }
 
    void reverse() {
        if (!head)
            return;
        Node<T> *current = head;
        do {
            swap(current->next,current->prev);
            current = current->prev;
        } while (current != head);
        head = head->next;
    }
};
 
int main() {
    DoublyCircularLinkedList<int> list;
    list.append(1);
    list.append(2);
    list.append(3);
    list.append(4);
 
    std::cout << "Original list: ";
    list.display();
 
    list.reverse();
 
    std::cout << "Reversed list: ";
    list.display();
 
    return 0;
}