TypeScript数据结构与算法(13)基于LinkedList实现的Map

源码如下:

import { Interface_Map } from "../Interface_Map";


class Node<K, V> {

    public key: K; //
    public value: V;//
    public next: Node<K, V>;

    public constructor(key: K, value: V, next: Node<K, V>) {
        this.key = key;
        this.value = value;
        this.next = next;
    }
}


/**
* Autor: Created by 李清风 on 2021-01-02.
* Desc: 基于链表的映射实现,字典,dict,关键词:键值对
*/
export class DataStruct_LinkedList_Map<K, V> implements Interface_Map<K, V> {


    private dummyHead: Node<K, V>;
    private size: number;

    public constructor() {
        this.dummyHead = new Node<K, V>(null, null, null);
        this.size = 0;
    }


    //不允许重复
    add(key: K, value: V): void {
        let node = this.getNode(key);
        if (node == null) {
            this.dummyHead.next = new Node(key, value, this.dummyHead.next);
        } else {
            //用户想更新
            node.value = value;
        }
    }


    //在map中删除某个元素
    remove(k: K): V {
        let prev = this.dummyHead;
        while (prev.next != null) {
            if (prev.next.key == k) { //可以自己封装一个equals
                break;
            }
            prev = prev.next;
        }

        if (prev.next != null) {
            let delNode = prev.next;
            prev.next = delNode.next;
            delNode.next = null;//与链表脱离
            return delNode.value;
        }
        return null; //未找到key对应元素
    }


    contains(k: K): boolean {
        return this.getNode(k) != null;
    }

    //查找某个节点
    private getNode(k: K) {
        let cur = this.dummyHead.next;
        while (cur != null) {
            if (cur.key == k) {
                return cur;
            }
            cur = cur.next;
        }
        return null;
    }


    //从map中get指定元素
    get(k: K): V {
        let node = this.getNode(k);
        return node == null ? null : node.value;
    }


    //更新指定值
    set(k: K, v: V): void {
        let node = this.getNode(k);
        if (node == null) {
            throw new Error("Doesn't exist!");
        }
        node.value = v;
    }


    getSize(): number {
        return this.size;
    }


    isEmpty(): boolean {
        return this.size == 0;
    }
}

 

posted @ 2021-01-21 18:27  CYNLINQ  阅读(199)  评论(0)    收藏  举报