Map

作者: SeekerLinJunYu | 来源:发表于2019-03-13 00:24 被阅读0次
/**
 * The class LinkedListMap is encapsulated in two layers-->
 * -->Node && Linkedlist
 * @author Administrator
 *
 */
public class LinkedListMap<K ,V> implements Map<K ,V>{
    private class Linkedlist{
        /**
         * Inner class of Linkedlist
         * class Node
         * @author Administrator
         *
         */
        private class Node{
            K key;
            V value;
            Node next;
            
            public Node(K key,V value,Node next){
                this.value = value;
                this.key = key;
                this.next = next;
            }
            public Node(){
                this(null,null,null);
            }
            
            public Node(K key,V value) {
                this(key,value,null);
            }
        }
        
        private int size;
        public Node dummyHead;
        
        /**
         * complete the initialized
         * in the constructor
         */
        public Linkedlist(){
            size = 0;
            dummyHead = new Node();
        }
        
        /**
         * LinkedList
         * isEmpty()
         * @return
         */
        public boolean isEmpty() {
            return size==0;
        }
        
        /**
         * LinkedList
         * getSize()
         * @return
         */
        public int getSize() {
            return size;
        }
        /**
         * determine whether the linkedlist contains target key
         * @param key
         * @return
         */
        
        public boolean contains(K key) {
            Node cur = dummyHead.next;
            while(cur != null) {
                if (cur.key.equals(key)) {
                    return true;
                }
                cur = cur.next;
            }
            return false;           
        }
        /**
         * gets the value of the target key 
         * @param key
         * @return
         */
        public V get(K key) {
            Node cur = dummyHead.next;
            while(cur != null) {
                if (cur.key.equals(key)) {
                    return cur.value;
                }
                cur = cur.next;
            }
            return null;
        }
        
        /**
         * set a new set of values for the linkedlist
         * @param key
         * @param value
         */
        public void set(K key, V value) {
            Node cur = dummyHead.next;
            while(cur != null) {
                if (cur.key.equals(key)) {
                    cur.value = value;
                    return;
                }
                cur = cur.next;
            }
            /*
             *第二种可行的代码,每一次操作的都是下一个节点
             * while(cur.next!=null){
             *      if(cur.next.key.equals(key)){
             *          cur.next.value = value;
             *          return;
             *      }
             *      cur = cur.next;
             * }
             * 
             * 
            */
            
            /**
             * if the target is not exist in the LinkedlList
             * we add a new node in the front of the LinkedList
             */
            
            Node newNode = new Node(key,value);
            newNode.next = dummyHead.next;
            dummyHead.next = newNode;
            
            
        }
        
        /**
         * method remove--> remove the target node 
         * @param key
         */
        
        public V remove(K key) {
            Node pre = dummyHead;
            while(pre.next != null) {
                if (pre.next.key.equals(key)) {
                    Node delNode = pre.next;
                    pre.next = delNode.next;
                    delNode.next = null;
                    size--;
                    return delNode.value;
                }
                else                    // -->加与不加else有天壤之别
                    pre = pre.next;     
            }
            return null;
        }
        
        /**
         * add a set of value into linkedlist
         * @param key
         * @param value
         */
        public void add(K key, V value) {
            Node cur = dummyHead.next;
            while(cur != null) {
                if(cur.key == key) {
                    cur.value = value;
                    return;
                }
                cur = cur.next;
            }
            
            /*
            Node newNode = new Node(key,value);
            newNode.next = dummyHead.next;
            dummyHead.next = newNode;
            */
            // add a new node in the front
            // simplified to a row of code
            dummyHead.next = new Node(key,value,dummyHead.next);
            size++;
        }   
    }
    
    private Linkedlist linkedlist;
    private int size;
    
    public LinkedListMap() {
        linkedlist = new Linkedlist();      
    }
    
    /**
     * LinkedListMap
     * method-->add
     */
    @Override
    public void add(K key,V value) {
        linkedlist.add(key, value);
    }
    
    /**
     * LinkedListMap
     * method-->contains
     */
    @Override
    public boolean contains(K key) {
        return linkedlist.contains(key);
    }
    
    /**
     * LinkedListMap
     * method-->getSize
     */
    @Override
    public int getSize() {
        return linkedlist.getSize();
    }
    
    /**
     * LinkedListMap
     * method-->set
     */
    @Override 
    public void set(K key, V value) {
        linkedlist.set(key, value);
    }
    
    /**
     * LinkedListMap
     * method-->remove
     */
    @Override
    public V remove(K key) {
        return linkedlist.remove(key);
    }
    
    /**
     * LinkedListMap
     * method-->get
     */
    @Override
    public V get(K key) {
        return linkedlist.get(key);
    }
    
    /**
     * LinkedListMap
     * method-->isEmpty
     */
    @Override
    public boolean isEmpty() {
        return linkedlist.isEmpty();
    }
    
}

BSTMap

/// Leetcode 350. Intersection of Two Arrays II
/// https://leetcode.com/problems/intersection-of-two-arrays-ii/description/
///
/// 课程中在这里暂时没有介绍这个问题
/// 该代码主要用于使用Leetcode上的问题测试我们的BSTMap类

import java.util.ArrayList;

public class Solution {

    private interface Map<K, V> {

        void add(K key, V value);
        boolean contains(K key);
        V get(K key);
        void set(K key, V newValue);
        V remove(K key);
        int getSize();
        boolean isEmpty();
    }

    private class BSTMap<K extends Comparable<K>, V> implements Map<K, V> {

        private class Node{
            public K key;
            public V value;
            public Node left, right;

            public Node(K key, V value){
                this.key = key;
                this.value = value;
                left = null;
                right = null;
            }
        }

        private Node root;
        private int size;

        public BSTMap(){
            root = null;
            size = 0;
        }

        @Override
        public int getSize(){
            return size;
        }

        @Override
        public boolean isEmpty(){
            return size == 0;
        }

        // 向二分搜索树中添加新的元素(key, value)
        @Override
        public void add(K key, V value){
            root = add(root, key, value);
        }

        // 向以node为根的二分搜索树中插入元素(key, value),递归算法
        // 返回插入新节点后二分搜索树的根
        private Node add(Node node, K key, V value){

            if(node == null){
                size ++;
                return new Node(key, value);
            }

            if(key.compareTo(node.key) < 0)
                node.left = add(node.left, key, value);
            else if(key.compareTo(node.key) > 0)
                node.right = add(node.right, key, value);
            else // key.compareTo(node.key) == 0
                node.value = value;

            return node;
        }

        // 返回以node为根节点的二分搜索树中,key所在的节点
        private Node getNode(Node node, K key){

            if(node == null)
                return null;

            if(key.equals(node.key))
                return node;
            else if(key.compareTo(node.key) < 0)
                return getNode(node.left, key);
            else // if(key.compareTo(node.key) > 0)
                return getNode(node.right, key);
        }

        @Override
        public boolean contains(K key){
            return getNode(root, key) != null;
        }

        @Override
        public V get(K key){

            Node node = getNode(root, key);
            return node == null ? null : node.value;
        }

        @Override
        public void set(K key, V newValue){
            Node node = getNode(root, key);
            if(node == null)
                throw new IllegalArgumentException(key + " doesn't exist!");

            node.value = newValue;
        }

        // 返回以node为根的二分搜索树的最小值所在的节点
        private Node minimum(Node node){
            if(node.left == null)
                return node;
            return minimum(node.left);
        }

        // 删除掉以node为根的二分搜索树中的最小节点
        // 返回删除节点后新的二分搜索树的根
        private Node removeMin(Node node){

            if(node.left == null){
                Node rightNode = node.right;
                node.right = null;
                size --;
                return rightNode;
            }

            node.left = removeMin(node.left);
            return node;
        }

        // 从二分搜索树中删除键为key的节点
        @Override
        public V remove(K key){

            Node node = getNode(root, key);
            if(node != null){
                root = remove(root, key);
                return node.value;
            }
            return null;
        }

        private Node remove(Node node, K key){

            if( node == null )
                return null;

            if( key.compareTo(node.key) < 0 ){
                node.left = remove(node.left , key);
                return node;
            }
            else if(key.compareTo(node.key) > 0 ){
                node.right = remove(node.right, key);
                return node;
            }
            else{   // key.compareTo(node.key) == 0

                // 待删除节点左子树为空的情况
                if(node.left == null){
                    Node rightNode = node.right;
                    node.right = null;
                    size --;
                    return rightNode;
                }

                // 待删除节点右子树为空的情况
                if(node.right == null){
                    Node leftNode = node.left;
                    node.left = null;
                    size --;
                    return leftNode;
                }

                // 待删除节点左右子树均不为空的情况

                // 找到比待删除节点大的最小节点, 即待删除节点右子树的最小节点
                // 用这个节点顶替待删除节点的位置
                Node successor = minimum(node.right);
                successor.right = removeMin(node.right);
                successor.left = node.left;

                node.left = node.right = null;

                return successor;
            }
        }
    }

    public int[] intersect(int[] nums1, int[] nums2) {

        BSTMap<Integer, Integer> map = new BSTMap<>();
        for(int num: nums1){
            if(!map.contains(num))
                map.add(num, 1);
            else
                map.set(num, map.get(num) + 1);
        }

        ArrayList<Integer> res = new ArrayList<>();
        for(int num: nums2){
            if(map.contains(num)){
                res.add(num);
                map.set(num, map.get(num) - 1);
                if(map.get(num) == 0)
                    map.remove(num);
            }
        }

        int[] ret = new int[res.size()];
        for(int i = 0 ; i < res.size() ; i ++)
            ret[i] = res.get(i);

        return ret;
    }
}

相关文章

网友评论

      本文标题:Map

      本文链接:https://www.haomeiwen.com/subject/varapqtx.html