leetcode总结
2016-01-19 16:35 xiaomacgrady 阅读(243) 评论(0) 编辑 收藏 举报1hash table部分
HashSet内部维护一个HashMap对象。分析HashMap源码:
final Entry<K,V> getEntry(Object key) {
if (size == 0) {
return null;
}
int hash = (key == null) ? 0 : hash(key);
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
}
return null;
}
HashMap在查找一个key的对象内容时,通过将Key哈希,,然后比较列表中对象元素的hash值与key的hash是否相等,以及列表中的对像与key是否相等或者equals。
HashMap是线程不安全的,并且当Hash冲突时采用的方法是chaining(链表的方式解决)。
应用HashTable例子:
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
public RandomListNode copyRandomList(RandomListNode head) {
if(head==null)return null;
RandomListNode oldHead=head;
HashMap<RandomListNode,RandomListNode> map=new HashMap<>();
RandomListNode node=new RandomListNode(head.label);
RandomListNode res=node;
map.put(head,node);
while(head.next!=null)
{
node.next=new RandomListNode(head.next.label);
map.put(head.next,node.next);
head=head.next;
node=node.next;
}
head=oldHead;
node=res;
while(head!=null)
{
node.random=map.get(head.random);
head=head.next;
node=node.next;
}
return res;
}