# 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. 【Spring-Security】Re05 权限控制及403处理

    一.访问控制方法及控制项: 上述配置中的URL后面都离不开的一个访问控制抉择: 1.全部允许 PermiAll 2.全部拒绝 DenyAll 3.允许匿名访问 Anonymous 也就是普通访问者 4 ...

  2. NVIDIA公司的半成品项目cule——GPU端运行的Atari2600游戏环境——已经废弃的项目

    官网介绍地址: https://developer.nvidia.com/blog/new-open-source-gpu-accelerated-atari-emulator-for-reinfor ...

  3. 纯css美化滚动条样式

    https://www.emperinter.info/2020/09/20/scrollbar-in-browser/ 自己完善自己博客再Ipad等移动端的菜单时选用了左右滑动的菜单模式!当然就会使 ...

  4. Apache SeaTunnel社区首位学生Committer诞生!

    采访对象 | 陈炳烨 采访人&编辑 | Debra Chen Apache SeaTunnel社区第一位学生Committer就此诞生!这位来自西安交通大学软件工程专业的同学从较为简单的文档修 ...

  5. 单链表-18个基本操作代码实现C语言

    单链表-18个基本操作代码实现C语言 原文地址:https://www.cnblogs.com/actanble/p/6713434.html 无更改,仅复现 运行后如图,运行软件dev-C++,系统 ...

  6. SMU Summer 2023 Contest Round 14

    SMU Summer 2023 Contest Round 14 A. Potion-making 就是解一个\(\frac{i}{i + j} = \frac{k}{100}\)方程,然后循环暴力找 ...

  7. C#给类的添加扩展方法

    今天学习了给类添加扩展方法,这里记录下.我这记性不好,过不了两天就给忘记了. 下面的例子是给控件ListView类添加三个方法: 1.  AddItemInofStudent 作用是用结构体数据添加新 ...

  8. 在 SQLAlchemy 中实现数据处理的时候,实现表自引用、多对多、联合查询,有序id等常见的一些经验总结

    有时候,我们在使用SQLAlchemy操作某些表的时候,需要使用外键关系来实现一对多或者多对多的关系引用,以及对多表的联合查询,有序列的uuid值或者自增id值,字符串的分拆等常见处理操作. 1.在 ...

  9. SSM + Freemarker 开发框架快速搭建

    1.项目骨架建立 一.使用开发工具IDEA,构建Maven项目,然后调整Maven项目结构,使其成为一个标准的web项目: 此处不选择Maven骨架,直接Next: 输入项目的相关信息,直接Finis ...

  10. 【Python】之操作鼠标键盘,上传文件,并支持中文

    Mac系统实现操作键盘 Python中模拟键盘和鼠标最著名的模块是:pymouse和pykeyboard.一次安装两个模块比较麻烦,而有一个库整合了这两个模块,而且能支持跨平台操作,这个库叫PyUse ...