1. 概述
通过内部封装的链表,来实现字典结构。
2. 源码
public class LinkedListMap < K, V> implements Map < K, V> {
private class Node {
public K key;
public V value;
public Node next;
public Node ( K key, V value, Node next) {
this . key = key;
this . value = value;
this . next = next;
}
public Node ( K key) {
this ( key, null, null) ;
}
public Node ( ) {
this ( null, null, null) ;
}
@Override
public String toString ( ) {
return this . key + " : " + this . value;
}
}
private Node dummyHead;
private int size;
public LinkedListMap ( ) {
dummyHead = new Node ( ) ;
}
@Override
public void add ( K key, V value) {
Node node = getNode ( key) ;
if ( node == null) {
dummyHead. next = new Node ( key, value, dummyHead. next) ;
size++ ;
} else {
node. value = value;
}
}
@Override
public V remove ( K key) {
Node pre = dummyHead;
while ( pre. next != null) {
if ( key. equals ( pre. next. key) ) {
Node delNode = pre. next;
pre. next = delNode. next;
delNode. next = null;
size-- ;
return delNode. value;
}
pre = pre. next;
}
return null;
}
@Override
public V set ( K key, V newValue) {
Node node = getNode ( key) ;
if ( node == null) {
throw new IllegalArgumentException ( key + " doesn't exist!" ) ;
}
V oldValue = node. value;
node. value = newValue;
return oldValue;
}
@Override
public boolean contains ( K key) {
return getNode ( key) != null;
}
@Override
public V get ( K key) {
Node node = getNode ( key) ;
return node == null ? null : node. value;
}
@Override
public int getSize ( ) {
return size;
}
@Override
public boolean isEmpty ( ) {
return size == 0 ;
}
@Override
public String toString ( ) {
StringBuilder result = new StringBuilder ( ) ;
result. append ( String. format ( "Map size: %d " , getSize ( ) ) ) ;
Node cur = dummyHead. next;
while ( cur != null) {
result. append ( cur) . append ( " ===> " ) ;
cur = cur. next;
}
result. append ( "Null" ) ;
return result. toString ( ) ;
}
private Node getNode ( K key) {
Node cur = dummyHead. next;
while ( cur != null) {
if ( key. equals ( cur. key) ) {
return cur;
}
cur = cur. next;
}
return null;
}
}