Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef LINKED_LIST_H
- #define LINKED_LIST_H
- #include <iostream>
- template <typename T>
- class LinkedList {
- public:
- class Node {
- public:
- explicit Node(T val) : data{val}, next{nullptr} {}
- T& getValue() {
- return data;
- }
- const T& getValue() const {
- return data;
- }
- private:
- friend LinkedList;
- T data;
- Node *next;
- };
- LinkedList() : head{nullptr}, tail{nullptr} {}
- ~LinkedList() {
- Node *n = head, *prev = nullptr;
- while(n) {
- if (prev) {
- delete prev;
- }
- prev = n;
- n = n->next;
- }
- if (prev) {
- delete prev;
- }
- }
- void append(T val) {
- Node *n = new Node{val};
- if(tail) {
- tail->next = n;
- tail = n;
- } else {
- head = tail = n;
- }
- }
- void print() {
- using namespace std;
- cout << "List contents:" << endl;
- Node *n = head;
- while(n) {
- cout << n->getValue() << endl;
- n = n->next;
- }
- }
- Node* find(T val) {
- Node *n = head;
- while(n) {
- if(n->getValue() == val) {
- return n;
- }
- n = n->next;
- }
- return nullptr;
- }
- void delete_after(Node *n) {
- Node *tmp;
- if(!n) {
- tmp = head;
- n = head = head->next;
- delete tmp;
- } else if(n->next) {
- tmp = n->next;
- n->next = tmp->next;
- delete tmp;
- }
- if(!n || !n->next) {
- tail = n;
- }
- }
- bool remove(T val) {
- Node *current = head, *prev = nullptr;
- while(current) {
- if(current->getValue() == val) {
- delete_after(prev);
- return true;
- }
- prev = current;
- current = current->next;
- }
- return false;
- }
- private:
- Node *head, *tail;
- };
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement