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