sclass LineComp_LinkedList { sclass Node { int value; Node prev, next; } Node head; new MultiSetMap indexByElement; void replacePair(int pa, int pb, int replaceWith, LineComp_PairCounts pairCounts) { Set setA = indexByElement.get(pa); if (setA != null) for (Node node : cloneList(setA)) if (node.next != null && node.next.value == pb) { if (node.prev != null) pairCounts.remove(node.prev.value, pa); pairCounts.remove(pa, pb); if (node.next != null) pairCounts.remove(pb, node.next.value); indexByElement.remove(pa, node); node.value = replaceWith; indexByElement.add(pa, node); indexByElement.remove(pb, node.next); node = node.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 = head; while (node != null) { l.add(node.value); node = node.next; } ret l; } }