Advertisement
Guest User

Untitled

a guest
Feb 11th, 2016
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #ifndef LINKED_LIST_H
  2. #define LINKED_LIST_H
  3.  
  4. #include <iostream>
  5.  
  6.  
  7. template <typename T>
  8. class LinkedList {
  9.     public:
  10.  
  11.     class Node {
  12.         public:
  13.             explicit Node(T val) : data{val}, next{nullptr} {}
  14.  
  15.             T& getValue() {
  16.                 return data;
  17.             }
  18.  
  19.             const T& getValue() const {
  20.                 return data;
  21.             }
  22.         private:
  23.             friend LinkedList;
  24.             T data;
  25.             Node *next;
  26.     };
  27.  
  28.     LinkedList() : head{nullptr}, tail{nullptr} {}
  29.     ~LinkedList() {
  30.         Node *n = head, *prev = nullptr;
  31.         while(n) {
  32.             if (prev) {
  33.                 delete prev;
  34.             }
  35.             prev = n;
  36.             n = n->next;
  37.         }
  38.         if (prev) {
  39.             delete prev;
  40.         }
  41.     }
  42.  
  43.     void append(T val) {
  44.         Node *n = new Node{val};
  45.         if(tail) {
  46.             tail->next = n;
  47.             tail = n;
  48.         } else {
  49.             head = tail = n;
  50.         }
  51.     }
  52.  
  53.     void print() {
  54.         using namespace std;
  55.         cout << "List contents:" << endl;
  56.         Node *n = head;
  57.         while(n) {
  58.             cout << n->getValue() << endl;
  59.             n = n->next;
  60.         }
  61.     }
  62.  
  63.     Node* find(T val) {
  64.         Node *n = head;
  65.         while(n) {
  66.             if(n->getValue() == val) {
  67.                 return n;
  68.             }
  69.             n = n->next;
  70.         }
  71.         return nullptr;
  72.     }
  73.  
  74.     void delete_after(Node *n) {
  75.         Node *tmp;
  76.         if(!n) {
  77.             tmp = head;
  78.             n = head = head->next;
  79.             delete tmp;
  80.         } else if(n->next) {
  81.             tmp = n->next;
  82.             n->next = tmp->next;
  83.             delete tmp;
  84.         }
  85.         if(!n || !n->next) {
  86.             tail = n;
  87.         }
  88.     }
  89.  
  90.     bool remove(T val) {
  91.         Node *current = head, *prev = nullptr;
  92.         while(current) {
  93.             if(current->getValue() == val) {
  94.                 delete_after(prev);
  95.                 return true;
  96.             }
  97.             prev = current;
  98.             current = current->next;
  99.         }
  100.         return false;
  101.     }
  102.  
  103.     private:
  104.         Node *head, *tail;
  105.  
  106. };
  107.  
  108.  
  109. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement