Yes, code reuse would be really nice. Unfortunately I can't figure out how do that and not violate some of the design goals. 

The goal is that we use the least amount of memory and that there is no GC pressure when the algorithm is running. This is achieved by Item having multiple next/prev pointers. So depending which pointers you follow you will get a list of items, list of changes, list of removals and so on. 

Dart's LinkedList implementation means that the Item can only be in one LinkedList. Hence my own implementation of lists.