Singly Lined List

// Created by Sean on 5/19/18.
#include <iostream>

using namespace std;

struct ListNode {
    int v;
    ListNode *next;
    ListNode(int x) : v(x), next(NULL) {}
};

class List {
private:
    ListNode *head;
    ListNode *tail;

public:
    List() : head(NULL), tail(NULL) {}
    ~List() {
        cout << "destructor" << endl;
        while (head != NULL) remove_front();
    }

    void insert_front(int x) {
        ListNode *tmp = new ListNode(x);
        if (head == NULL) {
            tail = tmp;
        }
        tmp->next = head;
        head = tmp;
    }

    void remove_front() {
        ListNode *old = head;
        if (old) {
//            head = old->next;
            head = head->next;
            delete(old);
        }
    }

    void insert_end(int x) {
        ListNode *tmp = new ListNode(x);
        if (head == NULL) {
            head = tmp;
            tail = tmp;
        } else {
            tail->next = tmp;
            tail = tmp;
        }
    }

    void remove_end() {
        if (head == NULL) {
            cout << "empty" << endl;
            return;
        } else if (head->next == NULL) {
            cout << "One node" << endl;
            ListNode *curr = head;
            // bug: destructor error if delete the last node
//            head = head->next;
            head = NULL;
            delete(curr);
            return;
        } else {
            ListNode *curr = head->next;
            ListNode *prev = head;

            while (curr != tail) {
                curr = curr->next;
                prev = prev->next;
            }

            delete(curr);
            tail = prev;
            prev->next = NULL;
        }
    }

    //void display(ListNode *head) {
    void display() const {
        ListNode *ptr = head;
        while (ptr) {
            cout << ptr->v << endl;
            ptr = ptr->next;
        }
    }

};


int main() {
    List list;
    list.insert_front(2);
    list.insert_front(3);
    list.remove_end();
    list.remove_end();
    list.remove_end();
    list.display();
}

results matching ""

    No results matching ""