
数据结构源码
接口
public interface Map<K, V> {
void add(K key, V value);
V remove(K key);
boolean contains(K key);
V get(K key);
void set(K key, V value);
int getSize();
boolean isEmpty();
}
实现类
public class LinkedListMap<K, V> implements Map<K, V> {
/**
* 内部类,定义结点Node
*/
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, V value){
this(key, value, null)
}
public Node() {
this(null, null, null)
}
@Override
public String toString() {
return key.toString() + " : " + value.toString()
}
}
private Node dummyHead
private int size
public LinkedListMap() {
dummyHead = new Node()
size = 0
}
@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 prev = dummyHead
while (prev.next != null) {
if (prev.next.key.equals(key))
break
prev = prev.next
}
if (prev.next != null) {
Node delNode = prev.next
prev.next = delNode.next
delNode.next = null
size--
return delNode.value
}
return null
}
@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 void set(K key, V value) {
Node node = getNode(key)
if (node == null) {
throw new IllegalArgumentException(key + " doesn't exist!")
}
node.value = value
}
@Override
public int getSize() {
return size
}
@Override
public boolean isEmpty() {
return size == 0
}
private Node getNode(K key) {
Node cur = dummyHead.next
while (cur != null) {
if (cur.key.equals(key)) {
return cur
}
cur = cur.next
}
return null
}
}
数据结构拆解
维护字段和内部类
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, V value){
this(key, value, null);
}
public Node() {
this(null, null, null);
}
@Override
public String toString() {
return key.toString() + " : " + value.toString();
}
}
private Node dummyHead;
private int size;
构造函数
public LinkedListMap() {
dummyHead = new Node()
size = 0
}
增
@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 prev = dummyHead
while (prev.next != null) {
if (prev.next.key.equals(key))
break
prev = prev.next
}
if (prev.next != null) {
Node delNode = prev.next
prev.next = delNode.next
delNode.next = null
size--
return delNode.value
}
return null
}
改
@Override
public void set(K key, V value) {
Node node = getNode(key)
if (node == null) {
throw new IllegalArgumentException(key + " doesn't exist!")
}
node.value = value
}
查
@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;
}
private Node getNode(K key) {
Node cur = dummyHead.next;
while (cur != null) {
if (cur.key.equals(key)) {
return cur;
}
cur = cur.next;
}
return null;
}