class Main {
public static void main
(String[] args
) { class Node<T> {
T payload;
Node<T> next;
Node<T> prev;
public Node(T payload) {
this.payload = java.util.Objects.requireNonNull(payload);
}
}
class Tunnel<T> {
boolean hasExit;
Node<T> head;
Node<T> tail;
public void add(T t) {
Node<T> node = new Node<>(t);
if (head == null) {
head = node;
} else {
tail.next = node;
node.prev = tail;
}
tail = node;
}
public T remove() {
if (head == null) {
return null;
}
if (hasExit) {
Node<T> temp = head;
if (head.next == null) {
tail = null;
} else {
head.next.prev = null;
}
head = head.next;
return temp.payload;
} else {
Node<T> temp = tail;
if (head.next == null) {
head = null;
} else {
tail.prev.next = null;
}
tail = tail.prev;
return temp.payload;
}
}
}
Tunnel<String> t = new Tunnel<>();
t.hasExit = true;
t.add("Hugo");
t.add("Paco");
t.add("Luis");
System.
out.
println(t.
remove()); System.
out.
println(t.
remove()); t.hasExit = false;
System.
out.
println("¡Sin salida!"); t.add("Juan");
t.add("Olga");
t.add("Ciro");
for(String child
; (child
= t.
remove()) != null;) { }
}
}
Y2xhc3MgTWFpbiB7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewogICAgICAgIGNsYXNzIE5vZGU8VD4gewogICAgICAgICAgICBUIHBheWxvYWQ7CiAgICAgICAgICAgIE5vZGU8VD4gbmV4dDsKICAgICAgICAgICAgTm9kZTxUPiBwcmV2OwogICAgICAgICAgICBwdWJsaWMgTm9kZShUIHBheWxvYWQpIHsKICAgICAgICAgICAgICAgIHRoaXMucGF5bG9hZCA9IGphdmEudXRpbC5PYmplY3RzLnJlcXVpcmVOb25OdWxsKHBheWxvYWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNsYXNzIFR1bm5lbDxUPiB7CiAgICAgICAgICAgIGJvb2xlYW4gaGFzRXhpdDsKICAgICAgICAgICAgTm9kZTxUPiBoZWFkOwogICAgICAgICAgICBOb2RlPFQ+IHRhaWw7CiAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZChUIHQpIHsKICAgICAgICAgICAgICAgIE5vZGU8VD4gbm9kZSA9IG5ldyBOb2RlPD4odCk7CiAgICAgICAgICAgICAgICBpZiAoaGVhZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaGVhZCA9IG5vZGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRhaWwubmV4dCA9IG5vZGU7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5wcmV2ID0gdGFpbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRhaWwgPSBub2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1YmxpYyBUIHJlbW92ZSgpIHsKICAgICAgICAgICAgICAgIGlmIChoZWFkID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChoYXNFeGl0KSB7CiAgICAgICAgICAgICAgICAgICAgTm9kZTxUPiB0ZW1wID0gaGVhZDsKICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZC5uZXh0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZC5uZXh0LnByZXYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoZWFkID0gaGVhZC5uZXh0OwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wLnBheWxvYWQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIE5vZGU8VD4gdGVtcCA9IHRhaWw7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWQubmV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhaWwucHJldi5uZXh0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGFpbCA9IHRhaWwucHJldjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcC5wYXlsb2FkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFR1bm5lbDxTdHJpbmc+IHQgPSBuZXcgVHVubmVsPD4oKTsKICAgICAgICB0Lmhhc0V4aXQgPSB0cnVlOwogICAgICAgIHQuYWRkKCJIdWdvIik7CiAgICAgICAgdC5hZGQoIlBhY28iKTsKICAgICAgICB0LmFkZCgiTHVpcyIpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0LnJlbW92ZSgpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odC5yZW1vdmUoKSk7CiAgICAgICAgdC5oYXNFeGl0ID0gZmFsc2U7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLCoVNpbiBzYWxpZGEhIik7CiAgICAgICAgdC5hZGQoIkp1YW4iKTsKICAgICAgICB0LmFkZCgiT2xnYSIpOwogICAgICAgIHQuYWRkKCJDaXJvIik7CiAgICAgICAgZm9yKFN0cmluZyBjaGlsZDsgKGNoaWxkID0gdC5yZW1vdmUoKSkgIT0gbnVsbDspIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNoaWxkKTsKICAgICAgICB9Cgl9Cn0=