无序符号表(链表实现,JAVA,算法(四))
符号表简介:将键和值联系起来。能够将键值对插入符号表并希望在以后可以使用键找到对应的值。
链表作为一种简单的数据结构,也是最开始学习的,它可以稍加修改一下便可以用来实现队列和栈其它的数据结构。符号表使用链表无非就是实现简单,将它的每一个节点保存对应的键值对,就可以达到遍历键而找到值的操作了。链表的操作大都是线性的,例如无序插入(这里虽然是头结点插入,但由于需要遍历链表以查询是否重复键,也达到了线性复杂度),删除,查询…..
package com.lizi.datastructure.symboltable;
import java.util.ArrayList;
import java.util.List;//迭代器收集所有节点使用了标准库中的链表
//链表实现的无序符号表,不能允许键或值为null
public class SequentialSearchST<Key,Value> {
private Node first=null;//头结点
int size=0;
private class Node{
Key key;
Value value;
Node next;
public Node(Key key,Value value,Node next) {
this.key=key;
this.value=value;
this.next=next;
}
}
//给出的键找到值,如果存在键为空,那么循环可能中断,如果值为空,那么不存在与找到为null的键返回结果一致,
//故不允许空的键或值
public Value get(Key key) {
for (Node x=first; x!=null; x=x.next) {
if(key.equals(x.key))
return x.value;
}
return null;
}
//查找给定的键,找到则更新其值,否则在头节点处新建节点
public void put(Key key,Value value) {
if(key==null||value==null) return;
for (Node x=first; x!=null; x=x.next) {
if(key.equals(x.key)){
x.value=value;
return;
}
}
first=new Node(key, value, first);
size++;
}
//删除对应的键值对节点,返回其值
public Value delete(Key key) {
Node pre=first;
Value value=null;
for (Node now=first; now!=null;pre=now, now=now.next) {
if(key.equals(now.key)){
value=now.value;
size--;
if(key.equals(first.key)) first=now.next;
else pre.next=now.next;
}
}
return value;
}
//未排序的所有键加入到迭代器中
public Iterable<Key> keys() {
List<Key> keys=new ArrayList<Key>(size);
for (Node x=first; x!=null; x=x.next) {
keys.add(x.key);
}
return keys;
}
public boolean contains(Key key) {
return get(key)!=null;
}
public boolean isEmpty() {
return size==0;
}
public int size() {
return size;
}
public void print() {
System.out.println();
for (Node x=first; x!=null; x=x.next) {
System.out.print(x.value+" ");
}
}
}