手写的 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;
}
}