Этот рекурсивный вызов метода remove () внутри блока if выглядит неправильно.
Вы уже находитесь в списке, вы определили первый соответствующий объект. Так что теперь ваш код должен действительно удалить этот соответствующий объект. Удаление означает обновление обеих ссылок соответственно.
Делай эти вещи на бумаге! Нарисуйте двойной связанный список с узлами и связями между ними. Затем спросите себя, что на самом деле означает удаление узла, который имеет одну или две ссылки, входящие (и потенциально выходящие). Вы должны будете изменить ссылки с предыдущего узла и тот, который следует за узлом, который должен быть удален!