К сожалению, моя копия CLRS сейчас находится в другой стране, поэтому я не могу использовать ее как справочную. Однако вот что я думаю:
В основном, двусвязный список поддерживает O (1) удаления, потому что если вы знаете адрес элемента, вы можете просто сделать что-то вроде:
x.left.right = x.right;
x.right.left = x.left;
чтобы удалить объект из связанного списка, в то время как, как и в связанном списке, даже если у вас есть адрес, вам нужно выполнить поиск в связанном списке, чтобы найти его предшественника:
pred.next = x.next
Итак, когда вы удаляете элемент из хеш-таблицы, вы ищите его (O (1) из-за свойств хеш-таблиц), а затем удаляете его в O (1), так как у вас теперь есть адрес.
Если бы это был односвязный список, вам нужно было бы найти предшественника объекта, который вы хотите удалить, что заняло бы O (n).
Тем не менее:
Меня также немного смущает это утверждение в случае цепочек хеш-таблиц из-за того, как работает поиск. В цепочечной хэш-таблице, если есть столкновение, вам уже нужно пройтись по связанному списку значений, чтобы найти нужный элемент, и, следовательно, также необходимо будет найти его предшественника.
Но то, как формулируется выражение, дает пояснение: «Если хеш-таблица поддерживает удаление, то ее связанные списки должны быть дважды связаны, чтобы мы могли быстро удалить элемент. Если списки были связаны только по одному, то удалить элемент x, нам сначала нужно найти x в списке T [h (x.key)], чтобы мы могли обновить следующий атрибут предшественника x. "
Это говорит о том, что у вас уже есть элемент x, что означает, что вы можете удалить его описанным выше способом. Если бы вы использовали односвязный список, даже если у вас уже был элемент x, вам все равно придется найти его предшественника, чтобы удалить его.