Implement linked list

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;

}