热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python实现单链表和字典

本文记录使用Python练习实现单链表和字典的代码

目录结构:

.
|-- demo
|   |-- main.py
|   |-- src
|   |   |-- my_dict.py
|   |   |-- my_linked_list.py

单链表:

# _*_coding: utf-8 _*_
# https://zhuanlan.zhihu.com/p/60057180


class LinkedListNode():
    """链表节点"""

    def __init__(self, item, next=None):
        self.item = item
        self.next = next


class SignleLiknedList():
    """单向链表"""

    def __init__(self):
        self.__header: LinkedListNode = None
        self.__current_node: LinkedListNode = None
        self.__count: int = 0

    def add(self, node: LinkedListNode) -> None:
        self.__count += 1
        if self.__header is None:
            self.__header = node
            self.__current_node = self.__header
            return
        self.__current_node.next = node
        self.__current_node = node

    def remove(self, node: LinkedListNode) -> bool:
        if node is None:
            return False
        if node is self.__header:
            self.__header = None
            self.__count -= 1
            return True
        prev_node = self.__header
        for item in self.nodes():
            if node is item:
                prev_node.next = node.next
                if node is self.__current_node:
                    self.__current_node = prev_node
                node = None
                self.__count -= 1
                return True
            prev_node = item
        return False

    def clear(self):
        self.__header = None
        self.__current_node = None

    def nodes(self):
        if self.__header is None:
            return None
        cur = self.__header
        while cur is not None:
            yield cur
            cur = cur.next

    @property
    def header(self):
        return self.__header

    @property
    def tail(self):
        return self.__current_node

    @property
    def count(self):
        return self.__count

字典:

# _*_coding: utf-8 _*_
# https://mp.weixin.qq.com/s?__biz=MzUyOTk2MTcwNg==&mid=2247486877&idx=1&sn=2c8a3021550666c95007b3f16ea231a9&chksm=fa584a18cd2fc30eecbb156372bce3fa929e39f935efee1d4f6c0b3cbc72ea6cb735428a9630&mpshare=1&scene=1&srcid=0926bBiOoZf8H1BplT1khvpH&sharer_sharetime=1601095103197&sharer_shareid=266dc9451fd28ecaad4697cc057771d2&key=0a19845a51c58415f5e23037fbc78c748ace9ba0a5aaff408c5faabf53c5a340c940294dabd0b4e78af014a0cb939f4ca5f86df138f966f07e9a9ccd19418f9bd5524d1aa7ac2fc257a8ae781dcd18f3335574dcc958120fe0333d34318196127af61fdf3198a7173eaf00a79345938a05215220713204bbbee84e6351423d92&ascene=1&uin=MTI5MDA0NDAwOA%3D%3D&devicetype=Windows+10&version=62070158&lang=zh_CN&exportkey=AZCTq18RYFqS%2BBII%2Bu4pvpU%3D&pass_ticket=Nmlj6bXbHC6L8HV47I7Ld1x7IUpyK6Oqb6DGKPU37iJB0Q8koxVXwnDD%2BCT1aBJh&wx_header=0
from demo.src.my_linked_list import (SignleLiknedList, LinkedListNode)


class MyDict():
    """自己实现字典结构,非线程安全"""
    __factor = 0.75

    def __init__(self, value_type: type, capacity: int):
        if value_type is None or type(value_type) is not type:
            raise ValueError(value_type)
        if capacity <= 0:
            raise ValueError(capacity)
        self.__value_type = value_type
        self.__capacity = capacity
        self.__count = 0
        self.__buckets = [None for i in range(0, capacity)]

    @property
    def count(self) -> int:
        return self.__count

    def add(self, key, value) -> None:
        __entry = __Entry(0, '', '')
        if type(value) is not self.__value_type:
            raise TypeError
        key_hash = hash(key)
        bucket_no = key_hash % self.__capacity
        if self.__buckets[bucket_no] is None:
            self.__buckets[bucket_no] = SignleLiknedList()
        entry_list: SignleLiknedList = self.__buckets[bucket_no]

        node = self.__get_entry(key)
        if node is None:
            entry = _Entry(key_hash, key, value)
            entry_list.add(LinkedListNode(entry))
            self.__count += 1
        else:
            node.item.value = value

        if entry_list.count > self.__factor*self.__capacity:
            self.__reset()

    def get(self, key: str):
        node = self.__get_entry(key)
        return None if node is None else node.item.value

    def remove(self, key):
        key_hash = hash(key)
        bucket_no = key_hash % self.__capacity
        entry_list = self.__buckets[bucket_no]
        node = self.__get_entry(key)
        remove_result = entry_list.remove(node)
        if remove_result:
            self.__count -= 1
        return remove_result

    def __reset(self):
        old_cap = self.__capacity
        self.__capacity = 2*self.__capacity
        new_buckets = [None for i in range(0, self.__capacity)]
        for i in range(0, old_cap):
            entry_list = self.__buckets[i]
            if entry_list is None:
                continue
            for node in entry_list.nodes():
                new_bucket_no = node.item.hash_code % self.__capacity
                if new_buckets[new_bucket_no] is None:
                    new_buckets[new_bucket_no] = SignleLiknedList()
                new_entry_list = new_buckets[new_bucket_no]
                new_entry_list.add(node)
        self.__buckets = new_buckets

    def __get_entry(self, key) -> LinkedListNode:
        if key is None:
            raise ValueError
        if type(key) is not str:
            raise TypeError
        key_hash = hash(key)
        bucket_no = key_hash % self.__capacity
        entry_list = self.__buckets[bucket_no]
        if entry_list is None:
            return None
        for node in entry_list.nodes():
            if node.item.hash_code == key_hash and node.item.key == key:
                return node
        return None


class _Entry():
    def __init__(self, hash_code: int, key: str, value):
        self.__hash_code = hash_code
        self.__key = key
        self.__value = value

    @property
    def key(self):
        return self.__key

    @property
    def value(self):
        return self.__value

    @value.setter
    def value(self, value):
        self.__value = value

    @property
    def hash_code(self):
        return self.__hash_code

 


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了如何使用vue-awesome-swiper组件,包括在main.js中引入和使用swiper和swiperSlide组件,以及设置options和ref属性。同时还介绍了如何在模板中使用swiper和swiperSlide组件,并展示了如何通过循环渲染swipes数组中的数据,并使用picUrl属性显示图片。最后还介绍了如何添加分页器。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
author-avatar
常山他爹没有JJ2000_836
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有