我不明白这段代码中是否(before==null)Array[position]=e.next;before怎么能等于null?这意味着e==null不是吗?此外,在入口散列中,有C C、V V和下一个入口散列(因此是指向"下一个"入口散列的链接)但如果我们在下一步之前做。下一步=下一步;那么链接不会丢失吗?
public V delete(C c) {
int positionition = indiHash(c);
EntryHash<C, V> e = Array[position], before = null;
while (e != null && !e.key.equals(c)) {
before = e;
e = e.next;
}
if (e == null) return null;
if (before == null) Array[position] = e.next;
else before.next = e.next;
size--;
return e.value;
}
e
是要删除的元素。
它是链表的一部分,因此它可能有一个元素before
和一个e.next
。
链表头存储在Array[position]
中(它是一个数组,因为哈希表中有很多这样的列表,每个哈希桶一个),每个元素都有一个指向next
元素的指针。
如果没有before
,则e
位于链表的头部。您可以通过将新列表头指向e.next
(也可以是null
,这意味着整个列表现在是空的)来删除它。
如果有before
,则必须通过将before.next
指向e.next
来修复列表。
before怎么能等于null?这意味着e==null不是吗?
否。e
可能是列表的头元素。则while循环永远不会进入,并且before
保持为空。
如果我们在before.next=e.next;那林克就不会丢了?
不知道你的意思。e
将从列表中删除,但这正是您想要的。如果列表之前是BEFORE => e => NEXT
,那么之后将是BEFORE => NEXT
。