# code:utf-8
# createTime:2023.8.17 # -----------------------------------------------------------------------------
class Node:
"""
节点类,每个数据就是一个节点,
包含一个数据位和一个指针位,
指针指向下一个数据的内存地址
"""
def __init__(self, data=None):
# 数据位
self.data = data
# 指针位
self.next = None # 输出节点的值
def __str__(self):
return str(self.data) # -----------------------------------------------------------------------------
# 为链表定义的错误类型 ---所需删除元素未找到
class DeleteNotFindError(Exception):
def __init__(self, message):
super().__init__(message) # ----------------------------------------------------------------------------- class Link:
"""单向链表""" def __init__(self):
self.head = None # 头指针
self.END = None # 尾指针
self._size = 0 # 链表大小的计数变量 # function -> 追加数据
def append(self, data)->None: # 初始化一个节点
node = Node(data = data) # 判断链表是否为空,如果链表不为空
if self.END:
self.END.next = node # 将指针指向下一个位置
self.END = node # 将数据存入内存 # 如果链表为空
else:
self.head = node # 头指针指向第一个数据
self.END = node # 尾指针指向第一个数据 # 计数变量的自增
self._size += 1 # function -> 获取链表大小
def getsize(self)->int:
return int(self._size) # 返回生成器
def __iter__(self):
insert = self.head # 获取头指针 # 判断下一个内存地址是否存在
while insert:
val = insert.data # 获取内存地址处存放的数据
insert = insert.next # 将指针指向下一个地址
yield val # 使用生成器yield返回数据 # function -> 删除节点
def delete(self, data):
# 此处采用双指针模式进行查找 insert = self.head # 前指针,指向查找元素的前一位
end = self.head # 后指针,指向查找元素 # 顺着链表查下去,时间复杂度位 O(n),如果后指针有值
while end: # 如果值相等
if end.data == data: # 如果需查找元素在开头
if end == self.head:
self.head = self.head.next # 直接修改头指针的指向
else:
insert.next = end.next # 将前指针的指向修改为后指针的下一位 self._size -= 1 # 计数变量自减 # 利用return结束循环
return # 双指针依次指向所有节点,知道查找到
insert = end
end = end.next else:
# 输出错误提示
raise DeleteNotFindError(f"Not find {data} in Link") # function -> 搜索节点
def find(self, data)->bool: # 这里直接套用iter方法
for i in self.__iter__(): # 找到节点
if i == data:
return True # 返回True else:
return False # 未找到节点返回False # function -> 清空链表
def clear(self):
"""clear the entire Linklist"""
self.head = None
self.END = None
self._size = 0 # ----------------------------------------------------------------------------- class Nodes(object): def __init__(self, data=None, next=None, prev=None):
self.data = data # 节点数据
self.next = next # 下一节点指针
self.prev = prev # 上一节点指针 # ----------------------------------------------------------------------------- class DoubleLink(object): def __init__(self):
self.head = None # 头节点
self.end = None # 尾节点
self._size = 0 # 计数 # function -> 添加元素
def append(self, data):
nodes = Nodes(data, None, None)
if self.head is None:
self.head = nodes
self.end = self.head
else:
nodes.prev = self.end
self.end.next = nodes
self.end = nodes
self._size += 1 # function -> 删除元素
def delete(self, data):
# 删除元素分为四种不同的情况,这里要进行分类讨论
# 第一种,链表为空
current = self.head
if current is None:
# 输出错误提示
raise DeleteNotFindError(f"Not find {data} in DoubleLink")
# 第二种,要删除的节点位于链表头部
elif current.data == data:
self.head = current.next
self.head.prev = None
self._size -= 1 elif self.end.data == data:
self.end = self.end.prev
self.end.next = None
self._size -= 1
else:
while current:
if current.data == data:
current.prev.next = current.next
current.next.prev = current.prev
self._size -= 1
return current = current.next
else:
raise DeleteNotFindError(f"Not find {data} in DoubleLink") # function -> 获取链表节点数
def getsize(self):
return int(self._size) # 返回生成器
def __iter__(self):
insert = self.head # 获取头指针 # 判断下一个内存地址是否存在
while insert:
val = insert.data # 获取内存地址处存放的数据
insert = insert.next # 将指针指向下一个地址
yield val # 使用生成器yield返回数据

说明:Node是单向链表的节点类,Nodes则是双向节点类

使用实例:

from main import *  # 导入链表代码所在文件

# 单链表
test = Link()
for i in range(1,10):
test.append(i)
for i in test:
print(i) print("__________________________")
# 双链表
test = DoubleLink()
for i in range(1,10):
test.append(i) test.delete(5)
for i in test:
print(i)

结果:

1
2
3
4
5
6
7
8
9
__________________________
1
2
3
4
6
7
8
9

python实现链表(单链,双链)的更多相关文章

  1. LeetCode初级算法的Python实现--链表

    LeetCode初级算法的Python实现--链表 之前没有接触过Python编写的链表,所以这里记录一下思路.这里前面的代码是和leetcode中的一样,因为做题需要调用,所以下面会给出. 首先定义 ...

  2. 算法之python创建链表实现cache

    算法之python创建链表实现cache 本节内容 问题由来 解决思路 实现代码 总结 1. 问题由来 问题起因于朋友的一次面试题,面试公司直接给出两道题,要求四十八小时之内做出来,语言不限,做出来之 ...

  3. 用最简单的方式学Python单链表

    Python 实现单链表 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列和链表都能够对其中的元素保持一定得顺序,但采用的方式 ...

  4. python数据结构链表之单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

  5. python --(链表)

    链表的使用 #/usr/bin/python#-*- coding: utf-8 -*-#Function: simulate the link-list in python#__author__: ...

  6. Python 数据结构 链表

    什么是时间复杂度 时间频度:一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才知道.但是我们不可能也没有必要对每一个算法都进行上机测试,只需要知道那个算法花费的时间多,那个算法花费得 ...

  7. Python—数据结构——链表

    数据结构——链表 一.简介 链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构.由一系列节点组成的元素集合.每个节点包含两部分,数据域item和指向下一个节 ...

  8. Python数据结构——链表的实现

    链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序.每个结构含有表元素和指向后继元素的指针.最后一个单元的指针指向NULL.为了方便链表的删除与插入操作,可以为链表添加一个表头. 删除操作 ...

  9. 【DataStructure In Python】Python模拟链表

    最近一直在学习Python和Perl这两门语言,两者共同点很多,也有不多.希望通过这样的模拟练习可以让自己更熟悉语言,虽然很多时候觉得这样用Python或者Perl并没有体现这两者的真正价值. #! ...

  10. Python 单向链表、双向链表

    用面向对象实现Linkedlist链表 单向链表实现append.iternodes 双向链表实现append.pop.insert.remove.iternodes 单向链表与双向链表 单向链表: ...

随机推荐

  1. C# Cefsharp 如何利用[Attribute]的把C#中的方法给到浏览器中调用

    背景 "有没有遇见这样一个场景,需要注入到浏览器的类太多,又想统一管理且不遗漏,有没有什么好办法?""有有有,把头伸过来~" 解决办法 第一步:提供一个[Att ...

  2. Odd and Even Zeroes 题解

    前言 题目链接:洛谷:UVA. 题目简述 定义 \(\operatorname{count}(num)\) 表示 \(num\) 末尾 \(0\) 的个数.给出 \(n\)(\(n \leq 10^{ ...

  3. git的快速入门(含常用指令)

    目录 概念 什么是git git与GitHub有什么区别 提交.仓库.分支 git的使用 从GitHub上下载别人的代码 直接将代码下载到本地 克隆仓库获取代码 将自己的代码上传到GitHub 本文拟 ...

  4. Fiddler远程调试js

    使用Fiddler调试本地js 在我们前端开发的日常工作中,发现服务器上某个css/javascript文件有问题,需要修改,那真是家常便饭.通常,我们需要将文件进行修改,然后重新发布再验证,这样就很 ...

  5. Buckingham-Reiner 方程和 Darby-Melson 经验方程

    由 Roni, et al. (2018), Woolley, et al. (2014), Yang, et al. (2017) 整理人便便的物理性质数据如下: 性质 值 密度 \((\text{ ...

  6. Python3将web服务和脚本做成开机自启

    1.将bwService文件放到 /etc/init.d/下 bwService文件(类型是文件) #!/bin/bash # # This shell script takes care of st ...

  7. 基于gitee+hexo搭建个人博客

    gitee准备 注册好gitee git安装与配置 下载git默认安装,配置 在之前下载的目录下,右键,选择[Git Bash Here] 配置用户 git config --global user. ...

  8. 修改kubeadm证书过期时间及更新k8s集群证书

    一.为什么要修改 kubeadm 证书时间 Kubernetes 官方提供了 kubeadm 工具安装 kubernetes 集群,使用这个工具安装集群非常便捷,使部署和升级 Kubernetes 变 ...

  9. 【YashanDB知识库】如何使用yasldr导入lob类型?

    问题现象 在各个项目实施中,有时候会使用到yasldr工具进行csv数据的导入.关于yasldr一般的使用方法,官方文档已经有详细的介绍,具体可见:yasldr使用指导.但在涉及LOB类型的导入时,会 ...

  10. Coursera self-driving2, State Estimation and Localization Week2, kalman filter 卡尔曼滤波

    KF - Kalman Filter: EKF - Extended Kalman Filter: ES-EKF - Error State Extended Kalman Filter 和EKF一样 ...