手写的 HashMap 里,链表元素按value排列
LeetCode版 706题,按value排序
public class LC706_排序 {
private class Node {
int key;
int value;
Node next;
Node(int key, int value) {
this.key = key;
this.value = value;
}
}
private final int N = 10000;
private Node[] node;
public LC706_排序() {
node = new Node[N];
}
private int hash(int key) {
return key % N;
}
public void put(int key, int value) {
int hash = hash(key);
if (node[hash] == null) {
node[hash] = new Node(-1, -1);
node[hash].next = new Node(key, value);
} else {
Node prev = node[hash];
Node temp = prev;
while (temp.next != null) {
if (temp.next.key == key) {
temp.next.value = value;
prev.next = sortList(prev.next);
return;
}
temp = temp.next;
}
temp.next = new Node(key, value);
}
}
public Node sortList(Node head) {
if (head == null || head.next == null) {
return head;
}
Node slow = head;
Node fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
Node tmp = slow.next;
slow.next = null;
Node left = sortList(head);
Node right = sortList(tmp);
Node pre = new Node(0, 0);
Node res = pre;
while (left != null && right != null) {
if (left.value < right.value) {
pre.next = left;
left = left.next;
} else {
pre.next = right;
right = right.next;
}
pre = pre.next;
}
pre.next = left != null ? left : right;
return res.next;
}
public int get(int key) {
int hash = hash(key);
if (node[hash] != null) {
Node cur = node[hash].next;
while (cur != null) {
if (cur.key == key) {
return cur.value;
}
cur = cur.next;
}
}
return -1;
}
public void remove(int key) {
int hash = hash(key);
if (node[hash] != null) {
Node prev = node[hash];
while (prev.next != null) {
if (prev.next.key == key) {
Node delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
return;
}
prev = prev.next;
}
}
}
}
hashMap源码版
public interface MyMap2 {
int put(Integer key, Integer value);
int get(Integer key);
int size();
interface Entry {
int getKey();
int getValue();
}
}
public class 手写HashMap implements MyMap2 {
private int capacity;
private Node[] table;
private int size;
class Node implements Entry {
private int hash;
private int key;
private int value;
private Node next;
public Node(int hash, int key, int value, Node next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
@Override
public int getKey() {
return key;
}
@Override
public int getValue() {
return value;
}
}
private int hash(Integer key) {
int h;
return (key == 0) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
@Override
public int put(Integer k, Integer v) {
int oldValue = 0;
int hash = hash(k);
int index = hash & (capacity - 1);
if (table[index] == null) {
table[index] = new Node(hash, k, v, null);
size++;
} else {
Node node = table[index];
while (node != null) {
if (node.hash == hash && k == node.getKey()) {
oldValue = node.getValue();
node.value = v;
return oldValue;
}
node = node.next;
}
table[index].next = new Node(hash, k, v, node);
size++;
}
sortList(table[0]);
return oldValue;
}
public Node sortList(Node head) {
if (head == null || head.next == null) {
return head;
}
Node slow = head;
Node fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
Node tmp = slow.next;
slow.next = null;
Node left = sortList(head);
Node right = sortList(tmp);
Node h = new Node(0, 0, 0, null);
Node res = h;
while (left != null && right != null) {
if (left.value < right.value) {
h.next = left;
left = left.next;
} else {
h.next = right;
right = right.next;
}
h = h.next;
}
h.next = left != null ? left : right;
return res.next;
}
@Override
public int get(Integer k) {
int hash = hash(k);
int index = hash & (capacity - 1);
if (table[index] == null) {
return 0;
} else {
Node node = table[index];
while (node != null) {
if (node.hash == hash && k == node.getKey()) {
return node.value;
} else {
node = node.next;
}
}
}
return 0;
}
@Override
public int size() {
return size;
}
}