#include <iostream>
template<typename T>
class DCLL
{
// internal representation of a Node
struct Node
{
T m_value;
Node* m_next;
Node* m_prev;
inline Node(T value, Node* prev, Node* next)
{
m_value = value;
m_prev = prev;
m_next = next;
if (m_prev)
m_prev->m_next = this;
if (m_next)
m_next->m_prev = this;
}
};
Node* m_head;
Node* m_tail;
public:
DCLL() : m_head(nullptr), m_tail(nullptr) {}
void push_front(T val)
{
m_head = new Node(val, nullptr, m_head);
if (!m_tail)
m_tail = m_head;
}
void push_back(T val)
{
m_tail = new Node(val, m_tail, nullptr);
if (!m_head)
m_head = m_tail;
}
void walk() const {
for (Node* node = m_head; node != nullptr; node = node->m_next) {
std::cout << node->m_value << ' ';
}
std::cout << '\n';
}
};
int main()
{
DCLL<int> ints;
ints.push_front(3);
ints.push_front(2);
ints.push_front(1);
ints.push_back(4);
ints.push_back(5);
ints.push_back(6);
ints.walk();
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgY2xhc3MgRENMTAogICAgewogICAgICAgIC8vIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgTm9kZQogICAgICAgIHN0cnVjdCBOb2RlCiAgICAgICAgewogICAgICAgICAgICBUICAgICAgICBtX3ZhbHVlOwogICAgICAgICAgICBOb2RlKiAgICBtX25leHQ7CiAgICAgICAgICAgIE5vZGUqICAgIG1fcHJldjsKCiAgICAgICAgICAgIGlubGluZSBOb2RlKFQgdmFsdWUsIE5vZGUqIHByZXYsIE5vZGUqIG5leHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1fdmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIG1fcHJldiA9IHByZXY7CiAgICAgICAgICAgICAgICBtX25leHQgPSBuZXh0OwogICAgICAgICAgICAgICAgaWYgKG1fcHJldikKICAgICAgICAgICAgICAgICAgICBtX3ByZXYtPm1fbmV4dCA9IHRoaXM7CiAgICAgICAgICAgICAgICBpZiAobV9uZXh0KQogICAgICAgICAgICAgICAgICAgIG1fbmV4dC0+bV9wcmV2ID0gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIE5vZGUqIG1faGVhZDsKICAgICAgICBOb2RlKiBtX3RhaWw7CgogICAgcHVibGljOgogICAgICAgIERDTEwoKSA6IG1faGVhZChudWxscHRyKSwgbV90YWlsKG51bGxwdHIpIHt9CgogICAgICAgIHZvaWQgcHVzaF9mcm9udChUIHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIG1faGVhZCA9IG5ldyBOb2RlKHZhbCwgbnVsbHB0ciwgbV9oZWFkKTsKICAgICAgICAgICAgaWYgKCFtX3RhaWwpCiAgICAgICAgICAgICAgICBtX3RhaWwgPSBtX2hlYWQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZvaWQgcHVzaF9iYWNrKFQgdmFsKQogICAgICAgIHsKICAgICAgICAgICAgbV90YWlsID0gbmV3IE5vZGUodmFsLCBtX3RhaWwsIG51bGxwdHIpOwogICAgICAgICAgICBpZiAoIW1faGVhZCkKICAgICAgICAgICAgICAgIG1faGVhZCA9IG1fdGFpbDsKICAgICAgICB9CgogICAgICAgIHZvaWQgd2FsaygpIGNvbnN0IHsKICAgICAgICAgICAgZm9yIChOb2RlKiBub2RlID0gbV9oZWFkOyBub2RlICE9IG51bGxwdHI7IG5vZGUgPSBub2RlLT5tX25leHQpIHsKICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBub2RlLT5tX3ZhbHVlIDw8ICcgJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgJ1xuJzsKICAgICAgICB9CiAgICB9OwoKICAgIGludCBtYWluKCkgCiAgICB7CiAgICAgICAgRENMTDxpbnQ+IGludHM7CiAgICAgICAgaW50cy5wdXNoX2Zyb250KDMpOwogICAgICAgIGludHMucHVzaF9mcm9udCgyKTsKICAgICAgICBpbnRzLnB1c2hfZnJvbnQoMSk7CiAgICAgICAgaW50cy5wdXNoX2JhY2soNCk7CiAgICAgICAgaW50cy5wdXNoX2JhY2soNSk7CiAgICAgICAgaW50cy5wdXNoX2JhY2soNik7CgogICAgICAgIGludHMud2FsaygpOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0=