/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class MyList
{
public final MyList tail;
private MyList
(Object head, MyList tail
) {
this.head = head;
this.tail = tail;
}
public static MyList cons
(Object head, MyList tail
) {
if (head == null)
return tail;
else if (head instanceof MyList)
return cons(((MyList)head).head, cons(((MyList)head).tail, tail));
else
return new MyList(head, tail);
}
public static MyList reverse(MyList list)
{
if (list == null)
return null;
else
return cons(reverse(list.tail), new MyList(list.head, null));
// [3, [4, [5, null]]]:
// cons(reverse([4, [5, null]]), [3, null])
// cons([5, 4, null], [3, null])
// cons([5, cons([4, null], [3, null])])
// cons(5, [4, [3, null]])
// [5, [4, [3, null]]]
}
public static void printMyList
(MyList list,
String format
) {
MyList current = list;
while (current != null)
{
System.
out.
printf(format, current.
head); current = current.tail;
}
}
{
MyList numbers = MyList.cons(1,
MyList.cons(2,
MyList.cons(3,
MyList.cons(4,
MyList.cons(5, null)
)
)
)
);
printMyList(numbers, "%2d");
printMyList(reverse(numbers), "%2d");
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgTXlMaXN0CnsKCXB1YmxpYyBmaW5hbCBPYmplY3QgaGVhZDsKCXB1YmxpYyBmaW5hbCBNeUxpc3QgdGFpbDsKCXByaXZhdGUgTXlMaXN0KE9iamVjdCBoZWFkLCBNeUxpc3QgdGFpbCkKCXsKCQl0aGlzLmhlYWQgPSBoZWFkOwoJCXRoaXMudGFpbCA9IHRhaWw7Cgl9CglwdWJsaWMgc3RhdGljIE15TGlzdCBjb25zKE9iamVjdCBoZWFkLCBNeUxpc3QgdGFpbCkKCXsKCQlpZiAoaGVhZCA9PSBudWxsKQoJCQlyZXR1cm4gdGFpbDsKCQllbHNlIGlmIChoZWFkIGluc3RhbmNlb2YgTXlMaXN0KQoJCQlyZXR1cm4gY29ucygoKE15TGlzdCloZWFkKS5oZWFkLCBjb25zKCgoTXlMaXN0KWhlYWQpLnRhaWwsIHRhaWwpKTsKCQllbHNlCgkJCXJldHVybiBuZXcgTXlMaXN0KGhlYWQsIHRhaWwpOwoJfQoJcHVibGljIHN0YXRpYyBNeUxpc3QgcmV2ZXJzZShNeUxpc3QgbGlzdCkKCXsKCQlpZiAobGlzdCA9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKCQllbHNlCgkJCXJldHVybiBjb25zKHJldmVyc2UobGlzdC50YWlsKSwgbmV3IE15TGlzdChsaXN0LmhlYWQsIG51bGwpKTsKCQkvLyBbMywgWzQsIFs1LCBudWxsXV1dOgoJCS8vIGNvbnMocmV2ZXJzZShbNCwgWzUsIG51bGxdXSksIFszLCBudWxsXSkKCQkvLyBjb25zKFs1LCA0LCBudWxsXSwgWzMsIG51bGxdKQoJCS8vIGNvbnMoWzUsIGNvbnMoWzQsIG51bGxdLCBbMywgbnVsbF0pXSkKCQkvLyBjb25zKDUsIFs0LCBbMywgbnVsbF1dKQoJCS8vIFs1LCBbNCwgWzMsIG51bGxdXV0KCX0KCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludE15TGlzdChNeUxpc3QgbGlzdCwgU3RyaW5nIGZvcm1hdCkKCXsKCQlNeUxpc3QgY3VycmVudCA9IGxpc3Q7CgkJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkKCQl7CgkJCVN5c3RlbS5vdXQucHJpbnRmKGZvcm1hdCwgY3VycmVudC5oZWFkKTsKCQkJY3VycmVudCA9IGN1cnJlbnQudGFpbDsKCQl9CgkJU3lzdGVtLm91dC5wcmludGxuKCk7Cgl9CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlNeUxpc3QgbnVtYmVycyA9IE15TGlzdC5jb25zKDEsCgkJCU15TGlzdC5jb25zKDIsCgkJCQlNeUxpc3QuY29ucygzLAoJCQkJCU15TGlzdC5jb25zKDQsCgkJCQkJCU15TGlzdC5jb25zKDUsIG51bGwpCgkJCQkJKQoJCQkJKQoJCQkpCgkJKTsKCQlwcmludE15TGlzdChudW1iZXJzLCAiJTJkIik7CgkJcHJpbnRNeUxpc3QocmV2ZXJzZShudW1iZXJzKSwgIiUyZCIpOwoJfQp9