#include <iostream>
template<class T>
struct Node
{
T data;
Node* previous = nullptr;
Node* next = nullptr;
Node(const T &data) : data(data) {}
};
template<class T>
class LinkedListD
{
private:
Node<T> *head = nullptr;
Node<T> *last = nullptr;
public:
Node<T>* addToEnd(const T &info);
Node<T>* addNodeBeforeTo(Node<T> *before, const T &info);
void print() const;
};
template<class T>
Node<T>* LinkedListD<T>::addToEnd(const T &info) {
Node<T>** n = ( last ) ? &(last->next) : &head;
Node<T>* newNode = new Node<T>( info );
*n = newNode;
newNode->previous = last;
last = newNode;
return newNode;
}
template<class T>
Node<T>* LinkedListD<T>::addNodeBeforeTo(Node<T> *before, const T &info) {
if ( !before ) return nullptr;
Node<T>* newNode = new Node<T>( info );
newNode->previous = before->previous;
newNode->next = before;
if ( before->previous )
before->previous->next = newNode;
before->previous = newNode;
if ( before == head )
head = newNode;
return newNode;
}
template<class T>
void LinkedListD<T>::print() const {
Node<T>* curr = head;
while (curr) {
std::cout << curr->data << ' ';
curr = curr->next;
}
std::cout << std::endl;
}
int main() {
LinkedListD<int> l;
l.addToEnd(10);
l.addToEnd(15);
Node<int>* n = l.addToEnd(20);
l.addToEnd(12);
l.print();
l.addNodeBeforeTo(n, 30);
l.print();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0IE5vZGUKewoJVCBkYXRhOwoJTm9kZSogcHJldmlvdXMgPSBudWxscHRyOwoJTm9kZSogbmV4dCA9IG51bGxwdHI7CiAgICBOb2RlKGNvbnN0IFQgJmRhdGEpIDogZGF0YShkYXRhKSB7fQp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgTGlua2VkTGlzdEQKewpwcml2YXRlOgoJTm9kZTxUPiAqaGVhZCA9IG51bGxwdHI7CglOb2RlPFQ+ICpsYXN0ID0gbnVsbHB0cjsKcHVibGljOgoJTm9kZTxUPiogYWRkVG9FbmQoY29uc3QgVCAmaW5mbyk7CglOb2RlPFQ+KiBhZGROb2RlQmVmb3JlVG8oTm9kZTxUPiAqYmVmb3JlLCBjb25zdCBUICZpbmZvKTsKCXZvaWQgcHJpbnQoKSBjb25zdDsKfTsKCnRlbXBsYXRlPGNsYXNzIFQ+Ck5vZGU8VD4qIExpbmtlZExpc3REPFQ+OjphZGRUb0VuZChjb25zdCBUICZpbmZvKSB7CglOb2RlPFQ+KiogbiA9ICggbGFzdCApID8gJihsYXN0LT5uZXh0KSA6ICZoZWFkOwogICAgTm9kZTxUPiogbmV3Tm9kZSA9IG5ldyBOb2RlPFQ+KCBpbmZvICk7CgkqbiA9IG5ld05vZGU7CgluZXdOb2RlLT5wcmV2aW91cyA9IGxhc3Q7CglsYXN0ID0gbmV3Tm9kZTsKCXJldHVybiBuZXdOb2RlOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpOb2RlPFQ+KiBMaW5rZWRMaXN0RDxUPjo6YWRkTm9kZUJlZm9yZVRvKE5vZGU8VD4gKmJlZm9yZSwgY29uc3QgVCAmaW5mbykgewoJaWYgKCAhYmVmb3JlICkgcmV0dXJuIG51bGxwdHI7CiAgICBOb2RlPFQ+KiBuZXdOb2RlID0gbmV3IE5vZGU8VD4oIGluZm8gKTsKCW5ld05vZGUtPnByZXZpb3VzID0gYmVmb3JlLT5wcmV2aW91czsKCW5ld05vZGUtPm5leHQgPSBiZWZvcmU7CglpZiAoIGJlZm9yZS0+cHJldmlvdXMgKQoJCWJlZm9yZS0+cHJldmlvdXMtPm5leHQgPSBuZXdOb2RlOwoJYmVmb3JlLT5wcmV2aW91cyA9IG5ld05vZGU7CglpZiAoIGJlZm9yZSA9PSBoZWFkICkKCQloZWFkID0gbmV3Tm9kZTsKCXJldHVybiBuZXdOb2RlOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUPgp2b2lkIExpbmtlZExpc3REPFQ+OjpwcmludCgpIGNvbnN0IHsKCU5vZGU8VD4qIGN1cnIgPSBoZWFkOwoJd2hpbGUgKGN1cnIpIHsKCQlzdGQ6OmNvdXQgPDwgY3Vyci0+ZGF0YSA8PCAnICc7CgkJY3VyciA9IGN1cnItPm5leHQ7Cgl9CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpIHsKCUxpbmtlZExpc3REPGludD4gbDsKCglsLmFkZFRvRW5kKDEwKTsKCWwuYWRkVG9FbmQoMTUpOwoJTm9kZTxpbnQ+KiBuID0gbC5hZGRUb0VuZCgyMCk7CglsLmFkZFRvRW5kKDEyKTsKCglsLnByaW50KCk7CgkKCWwuYWRkTm9kZUJlZm9yZVRvKG4sIDMwKTsKCglsLnByaW50KCk7CgoJcmV0dXJuIDA7Cn0=