Учитывая структуру данных, которую вы описываете (любой объект может соединиться с любым другим), я не думаю, что у вас есть выбор, кроме как сохранить уже посещенный список. Если бы ваши объекты были в иерархической древовидной структуре, то для реализации того, что вы хотите, мог бы быть реализован алгоритм рекурсивного обхода дерева.
В вашей структуре одноранговых объектов любой алгоритм, пытающийся покончить с уже посещенным списком, рискует зайти в бесконечные циклы для циклических ссылок. Я полагаю, вы могли бы создать флаг «посещение» в самих объектах, очистив их все перед запуском какого-либо алгоритма, но это кажется более неуклюжим, чем метод списка (и по своей природе менее поточно-ориентированный).