Created
September 12, 2016 01:35
-
-
Save rickyclarkson/8f867628b4b17d91292e3bc13b203a44 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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