Singly Lined List
#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 = 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;
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() 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();
}