该书随书源码的语言为C;我参考书中内容和配套源码,写了一套Python格式的配套源码。这套配套源码并非直接翻译C语言的配套源码,而是结合我的理解略作了修改。

SinglyLinkedNode 单链表结点class SinglyLinkedNode: """单链表结点""" __slots__ = "value", "next" # 使用__slots__减少内存占用 def __init__(self, value, next: "SinglyLinkedNode" = None): self.value = value # 数据域 self.next = next # 指针域 def __str__(self): return str(self.value) + "->" + str(self.next)

SinglyLinkedOperate 单链表的基本操作:读取、插入、删除、整表创建from typing import List ? from LinkedList.SinglyLinkedNode import SinglyLinkedNode ? ? # 单链表的读取(给定读取坐标) def get_node_by_index(head: "SinglyLinkedNode", index: int): for _ in range(index + 1): # 寻找第index个结点(从0开始计数)的前一个结点,如果链表长度不足则不删除 if not head.next: return None head = head.next else: return head.value ? ? # 单链表的添加操作(在给定结点后添加) def add_node_by_prev(prev: "SinglyLinkedNode", value): node = SinglyLinkedNode(value) # 使用给定值初始化新结点(node) node.next = prev.next # 令新结点(node)指向给定结点(prev)的下一个结点 prev.next = node # 令给定结点(prev)指向新结点(node) ? ? # 单链表的添加操作(给定插入坐标) def add_node_by_index(head: "SinglyLinkedNode", index: int, value): idx = -1 # 因为从头结点开始遍历,故使用头结点的坐标-1 while idx < index and head.next: # 寻找第index个结点(从0开始计数),如果链表长度不足则添加在链表尾部 head = head.next idx += 1 add_node_by_prev(head, value) # 在第index个结点后添加新结点 ? ? # 单链表的删除操作(在给定结点后删除) def delete_node_by_prev(prev: "SinglyLinkedNode"): prev.next = prev.next.next # 令给定结点(prev)直接指向被删除结点的下一个结点 ? ? # 单链表的删除操作(给定删除坐标) def delete_node_by_index(head: "SinglyLinkedNode", index: int): for _ in range(index): # 寻找第index个结点(从0开始计数)的前一个结点,如果链表长度不足则不删除 if not head.next: break head = head.next else: delete_node_by_prev(head) ? ? # 单链表的整表创建 def build_singly_list_node(values: List): node = head = SinglyLinkedNode(None) # 创建头结点,node指向尾结点(此时即头结点) for value in values: node.next = SinglyLinkedNode(value) # 创建新结点,并令当前链表尾部的终端结点指向新结点 node = node.next # node重新指向尾结点(即新创建的节点) return head ?

SinglyLinkedList 管理单链表的基本类:读取、插入、删除from LinkedList.SinglyLinkedNode import SinglyLinkedNode ? ? class SinglyLinkedList: """管理单向链表的基本类(使用头结点)""" ? def __init__(self): """初始化单向链表""" self._head = SinglyLinkedNode(None) # 创建头结点 self._size = 0 ? def __len__(self): """返回链表中元素的数量""" return self._size ? def is_empty(self): """返回链表是否为空""" return self._size == 0 ? def get(self, index: int): """依据坐标读取变量:返回链表中第index个元素的值""" if index < 0 or index >= self._size: return -1 curr = self._head for _ in range(index + 1): curr = curr.next return curr.value ? def add_at_head(self, value): """在头结点前添加结点""" self.add_at_index(0, value) ? def add_at_tail(self, value): """在尾结点之后添加结点""" self.add_at_index(self._size, value) ? def add_at_index(self, index: int, value): """在指定坐标前添加结点(若坐标无效则不添加):在链表中第index个元素前插入值为value的结点""" if index < 0 or index > self._size: return self._size += 1 prev = self._head for _ in range(index): prev = prev.next node = SinglyLinkedNode(value, prev.next) prev.next = node ? def delete_at_index(self, index: int): """依据坐标删除结点(若坐标无效则不删除)""" if index < 0 or index >= self._size: return self._size -= 1 prev = self._head for _ in range(index): prev = prev.next prev.next = prev.next.next

DoublyLinkedNode 双链表结点class DoublySimplyListNode: """双链表结点""" __slots__ = "value", "next", "prev" # 使用__slots__减少内存占用 def __init__(self, value, next: "DoublySimplyListNode" = None, prev: "DoublySimplyListNode" = None): self.value = value self.next = next self.prev = prev def __str__(self): if self.next and self.next.value: return str(self.value) + "<->" + str(self.value) else: return str(self.value) + "<->" + "None"

DoublyLinkedOperate 双链表的基本操作:插入、删除、整表创建from typing import List ? from LinkedList.DoublyLinkedNode import DoublySimplyListNode ? ? # 双链表的添加操作(在给定结点后添加) def add_node_by_prev(prev: "DoublySimplyListNode", value): node = DoublySimplyListNode(value) # 使用给定值初始化新结点(node) node.prev = prev # 令新结点(node)的前驱指针指向给定结点(prev) node.next = prev.next # 令新结点(node)的后续指针指向给定结点(prev)的后一个结点 ? prev.next = node # 令给定结点(prev)的后驱指针指向新结点 node.next.prev = node # 令后一个节点的前驱指针指向新结点 ? ? # 双链表的删除操作(删除给定结点) def delete_node_by_node(node: "DoublySimplyListNode"): node.prev.next, node.next.prev = node.next, node.prev # 令给定结点前一个结点的后驱指针指向给定结点的后驱结点,后一个结点的前驱指针指向给定结点的前驱结点 ? ? # 双链表的整表创建 def build_doubly_list_node(values: List): node = head = DoublySimplyListNode(None) # 创建头结点,node指向尾结点(此时即头结点) for value in values: new = DoublySimplyListNode(value) # 创建新结点 new.prev = node # 令新结点的前驱指针指向当前节点 new.next = head # 令新结点的后继指针指向当前节点 ? node.next = new # 并令当前链表尾部的终端结点指向新结点 node = node.next # node重新指向尾结点(即新创建的节点) head.prev = node # 令头结点的前驱指针指向链表尾部的终端结点 return head

DoublyLinkedList 管理双链表的基本类:插入、删除from LinkedList.DoublyLinkedNode import DoublySimplyListNode ? ? class DoublyLinkedBase: """管理双向链表的基本类(使用双侧哨兵结点)""" ? def __init__(self): self._header = DoublySimplyListNode(None) # 头部哨兵结点 self._trailer = DoublySimplyListNode(None) # 尾部哨兵结点 self._header.next = self._trailer self._trailer.prev = self._header self._size = 0 ? def __len__(self): """返回链表中元素的数量""" return self._size ? def is_empty(self): """返回链表是否为空""" return self._size == 0 ? def insert_between(self, value, prev, next): """向链表中添加新结点""" node = DoublySimplyListNode(value, prev, next) prev.next = node next.prev = node self._size += 1 return node ? def delete_node(self, node): """从链表中删除结点""" prev = node.prev next = node.next prev.next = next next.prev = prev self._size -= 1 value = node.value node.prev = node.next = node.val = None return value

python链表的创建_《大话数据结构》配套源码:链表(Python版)相关推荐

  1. python百度云盘搜索引擎_2016百度云网盘搜索引擎源码,附带Python爬虫+PHP网站+Xunsearch搜索引擎...

    品牌: 其他 语言: PHP 数据库: Mysql 源文件: 完全开源(含全部源文件) 授权: 免授权 规格: 整站源码 移动端: 无移动端 安装服务: 收费安装(另补差价) 操作系统: Window ...

  2. python开发直播网站_开发直播网站源码的三种计算机语言

    直播网站源码开发所用的语言,根据未来运营平台不同,其选择也不同.一般来说,如果是PC后台,那么会采用PHP语言编写,如果是在安卓上开发,则选择Java语言,如果是在iOS上开发,则采用object-c ...

  3. python 传奇服务端_传奇游戏服务器源码学习

    依据传奇游戏服务器源码总结了一下服务器开发中比较关心的一些问题. (1)线程之间的共享数据如何同步 CIntLock封装了临界区管理,包含了Lock()和Unlock()两个操作函数,所有 需要同步的 ...

  4. python文本编辑器下载_海龟编辑器官方下载|海龟编辑器(Python编辑器)下载 v1.3.4 官方版 - 绿点软件站...

    编程软件,积木和代码一键转化,学起来简单有趣,可以让孩子们搭一搭积木就轻松写出Python代码,既可以提高孩子对编程的学习兴趣,又可以降低小朋友们学习Python编程的门槛,海龟编辑器扩展功能强大,支 ...

  5. python快速入门系列_十五分钟快速入门系列:Python基础

    Python是一种面向对象的解释型语言, 源码和解释器CPython遵循 GPL协议. 年份 事件 1989 荷兰人Guido van Rossum发明 1991 第一个公开发行版发行 当前版本 3. ...

  6. threadpoolexecutor创建线程池_线程池ThreadPoolExecutor源码分析

    什么是线程池 创建线程要花费昂贵的资源和时间,如果任务来了才创建那么响应时间会变长,而且一个进程能创建的线程数量有限.为了避免这些问题,在程序启动的时候就创建若干线程来响应出来,它们被称为线程池,里面 ...

  7. 跳一跳python源码下载_教程 跳一跳源码

    这个压缩包为跳一跳工具源码 (安卓版) 仅供代码爱好者交流研究, 且不可用作其他用途,否则后果自负!!! 本来想分享一点数据分析领域-回归预测模型解读与实际工作中发挥用处 后来看到朋友圈被跳一跳霸屏, ...

  8. Redis 数据结构-字典源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 相关文章 Redis 初探-安装与使用 Redis 数据结构-字符串源码分析 本文将从以下几个方面介绍 前言 字典结构图 字典 ...

  9. Python基于OpenCV的人脸表情识别系统[源码&部署教程]

    1.项目背景 人脸表情识别是模式识别中一个非常重要却十分复杂的课题.首先对计算机人脸表情识别技术的研究背景及发展历程作了简单回顾.然后对近期人脸表情识别的方法进行了分类综述.通过对各种识别方法的分析与 ...

最新文章

  1. 1024. 科学计数法 (20)
  2. 错误处理:RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be
  3. linux备份目录命令tar,Tar命令备份还原Linux系统
  4. qsettings删除注册表_Qt QSettings读取注册表和ini | 学步园
  5. 【Step By Step】将Dotnet Core部署到Docker(中)
  6. 【bzoj1370】[Baltic2003]Gang团伙 并查集
  7. 简单的登陆拦截器在框架使用iframe时退出操作
  8. 证明华为模拟器Wvrp5.2a的二三层可以通信的trunk实验
  9. JS 全局函数 isNaN()、parseInt()、parseFloat()
  10. CFS任务的负载均衡(框架篇)
  11. Java思维导图(七)
  12. 关于批判性思维(Critical Thinking)
  13. vue项目实战-电商后台管理系统
  14. 安装ps提示重新启动计算机,安装Service Pack或执行DCPROMO后,出现错误或服务器重新启动 - Product Support Quick Note (PSQN) - 276184...
  15. java是什么类型语言_java属于什么类型语言
  16. 廖雪峰git教程阅读之一
  17. 国际版抖音正确打开方式
  18. 虚拟机安装64位Orace_Linux
  19. java kinect 人体识别_基于kinect的人体动作识别系统
  20. 计算机教师教育教学特长,计算机教师教学计划

热门文章

  1. 十个最值得阅读学习的C开源项目代码
  2. 【前端】JSON.stringfy 和 JSON.parse(待续)
  3. SQL 存储过程 解析XML
  4. Android系统Google Maps开发实例浅析
  5. 局域网通知系统(消息群发)
  6. c#读写XML文件 (转)
  7. 思考灰鸽子之后,新***的运营模式
  8. Windows上同时安装两个数据库
  9. Overlapping Rectangles 离散+线段树 +扫描线
  10. 四大传值详解:属性传值,单例传值,代理传值,block传值