代码改变世界

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;
                               }