#pragma once // We represent a singly linked list // with an pointer to its first element. template struct node { T data; node* next; node(const T& data_, node* next_ = nullptr) : data(data_), next(next_) {} }; template void append_back(node*& head, node*& tail, node* element) { if(head == nullptr) { head = tail = element; } else { tail->next = element; tail = tail->next; } } template bool is_sorted(node* list) { if(!list || !list->next) return true; node* prev = list; node* next = list->next; while(next) { if(prev->data > next->data) { return false; } prev = prev->next; next = next->next; } return true; } template void free_list(node* ll) { while(ll) { node* to_delete = ll; ll = ll->next; delete to_delete; } } template unsigned list_size(node* list) { unsigned size = 0; while(list) { ++size; list = list->next; } return size; } template node* push_front(node* head, const T& data) { return new node(data, head); }