第一种方法(基于无序链表来实现符号表),效率较低
package myowndataStructures.fuhaobiao;
import algs4.Queue;
import algs4.StdIn;
import algs4.StdOut;
/**
* Created by xudong on 2019/5/12.
* 基于无序链表实现的符号表
*/
public class SequentialSearchST<Key, Value> {
private int n; // 键值对数量
private Node first;
private class Node{
Key key;
Value value;
Node next;
public Node(Key key, Value value, Node node){
this.key = key;
this.value = value;
this.next = node;
}
}
public Value get(Key key){
for(Node n = first; n!=null; n = n.next){
if(n.key.equals(key)){
return n.value;
}
}
return null;
}
public void put(Key key, Value value){
for(Node n = first; n!=null; n=n.next){
if(n.key.equals(key)){
n.value = value;
return;
}
}
Node newNode = new Node(key, value, first);
first = newNode;
n++;
}
public int size(){
return n;
}
public Iterable<Key> keys(){
Queue<Key> queue = new Queue<Key>();
for(Node n = first; n != null; n = n.next){
queue.enqueue(n.key);
}
return queue;
}
public void delete(Key key){
if (key == null) throw new IllegalArgumentException("argument to delete() is null");
first = delete(first,key);
}
// 从Node x 开始删节点, 不适用表太大的情况,会导致栈溢出
public Node delete(Node x, Key key){
if(x == null){
return null;
}
if(x.key.equals(key)){
n--;
return x.next;
}
//注意 易出错
x.next = delete(x.next, key);
return x;
}
public static void main(String[] args) {
SequentialSearchST<String, Integer> st = new SequentialSearchST<String, Integer>();
String[] keys = "s,sf,sf,qrf,sfdsf,ss,gg,hhxc,x".split(",");
for (int i = 0; i < keys.length; i++) {
String key = keys[i];
st.put(key, i);
}
for (String s : st.keys())
StdOut.println(s + " " + st.get(s));
}
}