Implement a linked list
/*
* LinkedList.cpp
*
* Created on: Mar 31, 2012
* Author: Kiran Hegde
*/
#include <iostream>
using namespace std;
/**
* Node holding integer data
*/
struct Node {
int data;
Node *next;
};
/**
* A linked list
*/
class LinkedList {
public:
LinkedList() {
head = 0;
}
~LinkedList() {
Node *curr = head;
while (curr) {
Node *temp = curr->next;
delete curr;
curr = temp;
}
}
void insertBack(int n) {
Node *node = new Node();
node->data = n;
node->next = NULL;
if (head == NULL) {
head = node;
return;
}
Node *curr = head;
while (curr) {
if (curr->next == NULL) {
curr->next = node;
return;
}
curr = curr->next;
}
}
void insertFront(int n) {
Node *node = new Node();
node->data = n;
node->next = head;
head = node;
}
void removeBack() {
if (head == NULL)
return;
if (head->next == NULL) {
delete head;
head = NULL;
return;
}
Node *curr = head;
Node *prev = 0;
while (curr->next != NULL) {
prev = curr;
curr = curr->next;
}
prev->next = NULL;
delete curr;
}
void removeFront() {
if (head == 0)
return;
Node *temp = head;
head = head->next;
delete temp;
}
void remove(int n) {
Node *curr = head;
if (curr == 0)
return;
if (curr->data == n) {
head = head->next;
delete curr;
}
Node *prev = 0;
while (curr != 0) {
if (curr->data == n) {
break;
}
prev = curr;
curr = curr->next;
}
prev->next = curr->next;
delete curr;
}
Node *find(int n) {
if (head == NULL)
return NULL;
Node *curr = head;
while (curr != 0) {
if (curr->data == n) {
return curr;
}
curr = curr->next;
}
return NULL;
}
void insertAfter(int n, Node *node) {
if (node == 0) {
insertBack (n);
return;
}
Node *curr = head;
while (curr != 0) {
if (curr == node) {
Node *newNode = new Node();
newNode->data = n;
Node *temp = curr->next;
curr->next = newNode;
newNode->next = temp;
return;
}
curr = curr->next;
}
}
void print() {
Node *curr = head;
if (curr == 0) {
cout << "EMPTY" << endl;
} else {
while (curr) {
cout << curr->data << "-->";
curr = curr->next;
}
cout << "EMPTY" << endl;
}
}
void reverse() {
Node *curr = head;
Node *prev = 0;
while (curr) {
Node *temp = curr->next;
curr->next = prev;
prev = curr;
curr = temp;
}
head = prev;
}
private:
Node *head;
};
/**
* Test the code
*/
int main() {
LinkedList ll;
ll.insertBack(1);
ll.insertBack(2);
ll.insertBack(5);
ll.insertBack(8);
ll.insertBack(10);
ll.insertBack(20);
ll.print();
ll.insertFront(11);
ll.insertFront(12);
ll.print();
ll.removeFront();
ll.removeBack();
ll.print();
ll.insertFront(21);
ll.insertFront(22);
ll.remove(5);
ll.remove(8);
ll.print();
Node* n = ll.find(1);
ll.insertAfter(100, n);
ll.print();
ll.reverse();
ll.print();
return 0;
}