无序符号表(链表实现,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+"   ");
        }
    }

}
posted @ 2017-08-14 09:50  李子君啊  阅读(192)  评论(0编辑  收藏  举报