Skip to content

Instantly share code, notes, and snippets.

@m-primo
Created April 25, 2020 14:04
Show Gist options
  • Save m-primo/9bd6452a5b494bf5ba4db3917893316e to your computer and use it in GitHub Desktop.
Save m-primo/9bd6452a5b494bf5ba4db3917893316e to your computer and use it in GitHub Desktop.
Simple Double Linked List Implementation in C++
#include <iostream>
using namespace std;
#define null 0
class Node {
public:
int data;
Node *next;
Node *prev;
Node(int data) {
this->data = data;
next = NULL;
prev = NULL;
}
};
class LinkedList {
private:
Node *header;
Node *tail;
int size;
public:
LinkedList() {
header = NULL;
tail = NULL;
size = 0;
}
int getSize() {
return size;
}
void append(int data) {
Node *n = new Node(data);
if(header == null) {
header = n;
tail = n;
} else {
tail->next = n;
n->prev = tail;
tail = n;
}
size++;
}
void prepend(int data) {
Node *n = new Node(data);
if(header == null) {
header = n;
tail = n;
} else {
header->prev = n;
n->next = header;
header = n;
}
size++;
}
void insertAt(int pos, int data) {
if(pos > size + 1 || pos < 1) return;
else if(pos == 1) prepend(data);
else if(pos == size + 1) append(data);
else if(header != null) {
Node *n = new Node(data);
Node *current = header;
for(int i = 1; i < pos; i++) current = current->next;
current->prev->next = n;
n->prev = current->prev;
n->next = current;
current->prev = n;
size++;
}
}
void removeHeader() {
if(header->next == null) {
delete(header);
header = null;
tail = null;
} else if(header != null) {
header = header->next;
delete(header->prev);
header->prev = null;
}
size--;
}
void removeTail() {
if(header->next == null) removeHeader();
else if(header != null) {
tail = tail->prev;
delete(tail->next);
tail->next = null;
size--;
}
}
void removeAt(int pos) {
if(pos > size || pos < 1) return;
else if(pos == 1) removeHeader();
else if(pos == size) removeTail();
else if(header != null) {
Node *current = header;
for(int i = 1; i < pos; i++) current = current->next;
current->prev->next = current->next;
current->next->prev = current->prev;
delete(current);
size--;
}
}
void print() {
Node *temp = header;
while(temp != NULL) {
cout << temp->data << endl;
temp = temp->next;
}
cout << endl;
}
void printReverse() {
Node *n = tail;
while(n != null) {
cout << n->data << endl;
n = n->prev;
}
cout << endl;
}
void test() {
prepend(3);
prepend(1);
prepend(5);
print();
append(8);
append(7);
print();
insertAt(2, 9);
insertAt(4, 11);
print();
printReverse();
removeHeader();
print();
removeAt(3);
print();
removeTail();
print();
}
~LinkedList() {
Node *next = header->next;
while(header != null) {
next = header->next;
delete(header);
header = next;
}
}
};
int main() {
LinkedList list;
list.test();
//system("pause");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment