Skip to content

Instantly share code, notes, and snippets.

@rickyclarkson
Created September 12, 2016 01:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rickyclarkson/8f867628b4b17d91292e3bc13b203a44 to your computer and use it in GitHub Desktop.
Save rickyclarkson/8f867628b4b17d91292e3bc13b203a44 to your computer and use it in GitHub Desktop.
class ListZipperDemo {
// arguments are passed using the text field below this editor
public static void main(String[] args) {
Node oneThruFive = new Node(1, new Node(2, new Node(3, new Node(4, new Node(5, null)))));
Zipper zipper = new Zipper(null, oneThruFive);
System.out.println(zipper.next().next().set(30).next().remove().insert(40).reconstruct());
}
}
class Node {
final int value;
final Node next;
Node(int value, Node next) {
this.value = value;
this.next = next;
}
@Override
public String toString() {
return "[" + value + ", " + next + ']';
}
}
class Zipper {
final Node beforeBackwards;
final Node after;
Zipper(Node beforeBackwards, Node after) {
this.beforeBackwards = beforeBackwards;
this.after = after;
}
Zipper next() {
return new Zipper(new Node(after.value, beforeBackwards), after.next);
}
Zipper prev() {
return new Zipper(beforeBackwards.next, new Node(beforeBackwards.value, after));
}
Zipper set(int value) {
return new Zipper(beforeBackwards, new Node(value, after.next));
}
Zipper insert(int value) {
return new Zipper(beforeBackwards, new Node(value, after));
}
Zipper remove() {
return new Zipper(beforeBackwards, after.next);
}
Node reconstruct() {
if (beforeBackwards == null) {
return after;
}
return prev().reconstruct();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment