В системе сбора мусора можно иметь односвязный список с поддержкой логического удаления элементов без блокировок, если вас не волнует, когда физически освободится память для элементов, и если это невозможно добавить элемент сразу после удаляемого элемента. Присвойте каждому элементу удаленный флаг и создайте процедуру обхода списка, которая будет проверять при посещении каждого элемента, был ли удален следующий узел; если он есть, используйте сравнить и поменять местами, чтобы развернуть указатель «next» текущего узла. Обратите внимание, что возможно, что «следующий» указатель удаляемого узла может быть изменен, но только для пропуска узла, следующего за ним. Возможно, что изменение следующего указателя может привести к повторной привязке узла, который был только что отсоединен от списка (например, A-> B-> C-> D может, если B и C удалены одновременно, стать A-> B- > D (размахивая B
s указатель), а затем A-> C-> D (поворачивая указатель A к фиксированному значению указателя «next» B). Однако, если узел C был и продолжает помечаться как «удаленный», это не должно вызывать проблем, так как в следующий раз, когда список будет повторяться, указатель A переместится на D.
Два предостережения: -1- В системе без сбора мусора может быть трудно узнать, когда узел действительно может быть освобожден; освобождение узла и затем возврат указателя на него может привести к неопределенному поведению; -2- Если узел добавляется сразу после удаленного узла, указатель может качаться, чтобы отключить новый узел. Если узлы всегда будут добавляться в конец очереди, можно избежать этой последней проблемы, заканчивая очередь фиктивным узлом, который нельзя удалить, пока за ним не последует другой узел.