• 无序符号表(链表实现,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+"   ");
            }
        }
    
    }
    
  • 相关阅读:
    HRBUST 1819 石子合并问题--圆形版
    Linux 用户信息英文解释
    day 09 Linux下常见的打包压缩命令
    day 09作业
    第8天作业
    day 08 重定向/管道/sort/uniq/awk详解
    什么是输出重定向
    day07 Linux文件类型及软链接
    第6,7天作业
    day06 Linux根目录下重要目录
  • 原文地址:https://www.cnblogs.com/lizijuna/p/11907423.html
Copyright © 2020-2023  润新知