#include <iostream>
template <class T>
class Node {
public:
T value;
Node<T>* next;
Node(T value_, Node<T>* next_) : value(value_), next(next_) {}
Node(T value_) : value(value_), next(NULL) {}
};
using namespace std;
template <class T>
class List {
public:
List() : head(NULL) {}
void prepend(T val) {
Node<T>* node_ptr = new Node<T>(val, head);
head = node_ptr;
}
void print() {
cout << "[";
_node_loop(_print_node);
cout << "]" << endl;
}
~List() {
_node_loop(_del_node);
}
static List<T> from_array(T tarray[], int N) {
List<T> ls = List<T>();
for (int i = 0; i < N; i++) {
ls.prepend(tarray[i]);
}
return ls;
}
private:
Node<T>* head;
void _node_loop(void (*kernel)(Node<T>*)) {
Node<T>* node_ptr = head;
Node<T>* tmp;
while (node_ptr != NULL) {
tmp = node_ptr;
node_ptr = node_ptr->next;
kernel(tmp);
}
}
static void _print_node(Node<T>* node_ptr) {
if (node_ptr->next == NULL) {
cout << node_ptr->value;
}
else {
cout << node_ptr->value << ", ";
}
}
static void _del_node(Node<T>* node_ptr) {
delete node_ptr;
}
};
int main() {
int my_array[] = {1, 2, 3, 4, 5};
List<int> my_list = List<int>::from_array(my_array, 5);
my_list.print();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIE5vZGUgewpwdWJsaWM6CiAgICBUIHZhbHVlOwogICAgTm9kZTxUPiogbmV4dDsKICAgIE5vZGUoVCB2YWx1ZV8sIE5vZGU8VD4qIG5leHRfKSA6IHZhbHVlKHZhbHVlXyksIG5leHQobmV4dF8pIHt9CiAgICBOb2RlKFQgdmFsdWVfKSA6IHZhbHVlKHZhbHVlXyksIG5leHQoTlVMTCkge30KfTsKCgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBMaXN0IHsKcHVibGljOgogICAgTGlzdCgpIDogaGVhZChOVUxMKSB7fQoKICAgIHZvaWQgcHJlcGVuZChUIHZhbCkgewogICAgICAgIE5vZGU8VD4qIG5vZGVfcHRyID0gbmV3IE5vZGU8VD4odmFsLCBoZWFkKTsKICAgICAgICBoZWFkID0gbm9kZV9wdHI7CiAgICB9CgogICAgdm9pZCBwcmludCgpIHsKICAgICAgICBjb3V0IDw8ICJbIjsKICAgICAgICBfbm9kZV9sb29wKF9wcmludF9ub2RlKTsKICAgICAgICBjb3V0IDw8ICJdIiA8PCBlbmRsOwogICAgfQoKICAgIH5MaXN0KCkgewogICAgICAgIF9ub2RlX2xvb3AoX2RlbF9ub2RlKTsKICAgIH0KCiAgICBzdGF0aWMgTGlzdDxUPiBmcm9tX2FycmF5KFQgdGFycmF5W10sIGludCBOKSB7CiAgICAgICAgTGlzdDxUPiBscyA9IExpc3Q8VD4oKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICBscy5wcmVwZW5kKHRhcnJheVtpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsczsKICAgIH0KCnByaXZhdGU6CiAgICBOb2RlPFQ+KiBoZWFkOwoKICAgIHZvaWQgX25vZGVfbG9vcCh2b2lkICgqa2VybmVsKShOb2RlPFQ+KikpIHsKICAgICAgICBOb2RlPFQ+KiBub2RlX3B0ciA9IGhlYWQ7CiAgICAgICAgTm9kZTxUPiogdG1wOwogICAgICAgIHdoaWxlIChub2RlX3B0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgIHRtcCA9IG5vZGVfcHRyOwogICAgICAgICAgICBub2RlX3B0ciA9IG5vZGVfcHRyLT5uZXh0OwogICAgICAgICAgICBrZXJuZWwodG1wKTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIHZvaWQgX3ByaW50X25vZGUoTm9kZTxUPiogbm9kZV9wdHIpIHsKICAgICAgICBpZiAobm9kZV9wdHItPm5leHQgPT0gTlVMTCkgewogICAgICAgICAgICBjb3V0IDw8IG5vZGVfcHRyLT52YWx1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvdXQgPDwgbm9kZV9wdHItPnZhbHVlIDw8ICIsICI7CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyB2b2lkIF9kZWxfbm9kZShOb2RlPFQ+KiBub2RlX3B0cikgewogICAgICAgIGRlbGV0ZSBub2RlX3B0cjsKICAgIH0KfTsKCgoKaW50IG1haW4oKSB7CiAgICBpbnQgbXlfYXJyYXlbXSA9IHsxLCAyLCAzLCA0LCA1fTsKICAgIExpc3Q8aW50PiBteV9saXN0ID0gTGlzdDxpbnQ+Ojpmcm9tX2FycmF5KG15X2FycmF5LCA1KTsKICAgIG15X2xpc3QucHJpbnQoKTsKICAgIHJldHVybiAwOwp9