Linked List

 

  Linked list Array Dynamic array Balanced tree Random access list
Indexing $$\theta (n)$$ $$\theta (1)$$ $$\theta (1)$$ $$\theta (\log{n})$$ $$\theta (\log{n})$$
Insert/delete at beginning $$\theta (1)$$ N/A $$\theta (n)$$ $$\theta (\log{n})$$ $$\theta (1)$$
Insert/delete at end $$\theta (1)$$ N/A $$\theta (1)$$ amortized $$\theta (\log{n})$$ $$\theta (\log{n})$$
Insert/delete at middle search time + $$\theta (1)$$ N/A $$\theta (n)$$ $$\theta (\log{n})$$ $$\theta (\log{n})$$
Wasted space (average) $$\theta (n)$$ 0 $$\theta (n)$$ $$\theta (n)$$ $$\theta (n)$$

Reference: Wikipedia Linked List

 

 

#include <iostream>
using namespace std;

class Node
{
private:
    Node *next;
    int data;
public:
    Node(){};
    void setData(int nData)
    {
        data = nData;
    };
    void setNext(Node *nNext)
    {
        next = nNext;
    };
    int getData()
    {
        return data;
    };
    Node *Next()
    {
        return next;
    };
};

class List
{
private:
    Node *head;
public:
    List()
    {
        head = NULL;
    };
    void printList();
    void deleteNode(int data);
    void appendNode(int data);
    void insertNode(int data, int pos);
    void appendList(List secondList);
    void inverseList();
};

void List::printList()
{
    Node *tmp = head;
    if(tmp == NULL)
    {
        cout<<"Empty List"<<endl;
        return;
    }
    while(tmp != NULL)
    {
        cout<<tmp->getData()<<"->";
        tmp = tmp->Next();
    }
    cout<<"NULL"<<endl;
}
void List::appendNode(int data)
{
    Node *newNode = new Node();
    newNode->setData(data);
    newNode->setNext(NULL);
    
    Node *tmp = head;
    if(tmp != NULL)
    {
        while(tmp->Next() != NULL)
            tmp = tmp->Next();
        
        tmp->setNext(newNode);
    }
    else
        head = newNode;
    
}
void List::insertNode(int data, int pos)
{
    Node *tmp = head;
    if(tmp == NULL)
        return;
    
    int currentPos = 0;
    
    while(currentPos != pos-1 && pos > 0 && tmp->Next()!=NULL)
    {
        
        tmp = tmp->Next();
        currentPos++;
    }
    if(pos > currentPos+1)
    {
        cout<<"Insert fails."<<endl;
        return;
    }
    if(pos == 0) // Insert a node to the head
    {
        Node *newNode = new Node();
        newNode->setData(data);
        newNode->setNext(tmp);
        head = newNode;
    }
    else
    {
        Node *newNode = new Node();
        newNode->setData(data);
        newNode->setNext(tmp->Next());
        tmp->setNext(newNode);
    }
}
void List::deleteNode(int data)
{
    Node *tmp = head;
    if(tmp == NULL)
        return;
    
    if(tmp->Next() == NULL)
    {
        delete tmp;
        head = NULL;
    }
    else
    {
        if(head->getData() == data)
        {
            Node *ptr = head;
            head = ptr->Next();
            delete ptr;
        }
        else
        {
            Node *prev;
            Node *current = head;
            if(current->Next() == NULL)
                current = NULL;
            while(current != NULL)
            {
                if(current->getData() == data)
                {
                    prev->setNext(current->Next());
                    break;
                }
                else
                {
                    prev = current;
                    current = current->Next();
                }
            }
        }
    }
}
void List::appendList(List secondList)
{
    if(secondList.head == NULL)
        return;
    
    Node *tmp = head;
    if(tmp == NULL) //first list is empty
    {
        head = secondList.head;
        return;
    }
    while(tmp->Next() != NULL)
    {
        tmp = tmp->Next();
    }
    tmp->setNext(secondList.head);
        
        
}

void List::inverseList()
{
    Node* newHead = NULL;
    while (head != NULL)
    {
        Node* next = head->Next();
        head->setNext(newHead) ;
        newHead = head;
        head = next;
    }
    head = newHead;
}


int main(int argc, const char * argv[])
{
    List list;   
    list.appendNode(10);
    list.appendNode(20);
    list.appendNode(30);
    list.appendNode(40);
    cout<<"List: "<<endl;
    list.printList();
    cout<<"Inversed List:"<<endl;
    list.inverseList();
    list.printList();
  
    return 0;
}

 

Leave a Reply