sclass LineComp_LinkedList { sclass Node { int value; Node prev, next; } Node tail; new MultiSetMap indexByElement; *() {} *(L l) { fOr (int i : l) add(i); } void add(int i) { new Node n; n.prev = tail; if (tail == tail = n; } void replacePair(int pa, int pb, int replaceWith, LineComp_PairCounts pairCounts) { Set setA = indexByElement.get(pa); if (setA != null) for (Node node : cloneList(setA)) { Node next = node.next; if (next != null && next.value == pb) { if (node.prev != null) pairCounts.remove(node.prev.value, pa); pairCounts.remove(pa, pb); if (next != null) pairCounts.remove(pb, next.value); indexByElement.remove(pa, node); node.value = replaceWith; indexByElement.add(pa, node); indexByElement.remove(pb, node.next); // delete next if (next.next != null) next.next.prev = node; node.next = next.next; if (node.prev != null) pairCounts.add(node.prev.value, replaceWith); if (node.next != null) pairCounts.add(replaceWith, node.next.value); } } L toList() { new L l; Node node = tail; while (node != null) { l.add(node.value); node = node.next; } ret reverseInPlace(l); } }