| 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;
}