python实现链表(单链,双链)
# 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实现链表(单链,双链)的更多相关文章
- LeetCode初级算法的Python实现--链表
LeetCode初级算法的Python实现--链表 之前没有接触过Python编写的链表,所以这里记录一下思路.这里前面的代码是和leetcode中的一样,因为做题需要调用,所以下面会给出. 首先定义 ...
- 算法之python创建链表实现cache
算法之python创建链表实现cache 本节内容 问题由来 解决思路 实现代码 总结 1. 问题由来 问题起因于朋友的一次面试题,面试公司直接给出两道题,要求四十八小时之内做出来,语言不限,做出来之 ...
- 用最简单的方式学Python单链表
Python 实现单链表 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列和链表都能够对其中的元素保持一定得顺序,但采用的方式 ...
- python数据结构链表之单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- python --(链表)
链表的使用 #/usr/bin/python#-*- coding: utf-8 -*-#Function: simulate the link-list in python#__author__: ...
- Python 数据结构 链表
什么是时间复杂度 时间频度:一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才知道.但是我们不可能也没有必要对每一个算法都进行上机测试,只需要知道那个算法花费的时间多,那个算法花费得 ...
- Python—数据结构——链表
数据结构——链表 一.简介 链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构.由一系列节点组成的元素集合.每个节点包含两部分,数据域item和指向下一个节 ...
- Python数据结构——链表的实现
链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序.每个结构含有表元素和指向后继元素的指针.最后一个单元的指针指向NULL.为了方便链表的删除与插入操作,可以为链表添加一个表头. 删除操作 ...
- 【DataStructure In Python】Python模拟链表
最近一直在学习Python和Perl这两门语言,两者共同点很多,也有不多.希望通过这样的模拟练习可以让自己更熟悉语言,虽然很多时候觉得这样用Python或者Perl并没有体现这两者的真正价值. #! ...
- Python 单向链表、双向链表
用面向对象实现Linkedlist链表 单向链表实现append.iternodes 双向链表实现append.pop.insert.remove.iternodes 单向链表与双向链表 单向链表: ...
随机推荐
- 【SqlServer】02 SSMS工具基本使用入门
之前的安装中除了SqlServer,还有一个SSMS管理工具 数据库的访问依赖于工具 SSMS提供了两种登陆方式: 创建用户: 删除用户: 创建数据库: 删除数据库: 创建表: 设置表的字段,字段名称 ...
- 国内网友搭建的 Huggingface 镜像站 —— https://hf-mirror.com/
huggingface是什么这里不作解释. hugggingface的网站访问同Google一样,不能直接通过浏览器访问,需要科学的方式才可以,这里假设大家是知道如何访问Google的: huggin ...
- baselines中环境包装器EpisodicLifeEnv的分析
如题: class EpisodicLifeEnv(gym.Wrapper): def __init__(self, env): """Make end-of-life ...
- 国产最好用的操作系统——deepin,为什么不适合生产环境
前几天看了罗永浩的视频,他推荐了一本Intel创始人的书,看了这本书后想到书中大谈Intel和Microsoft的合作才创建下了今天的PC世界.看到这我就有些不爽了,现在美国各种控制和制裁我们的芯片, ...
- java关于数组的复制,反转、查找
一.数组的赋值: arr2=arr1;对于该赋值而言,地址值一样,所以arr1会随着arr2的变化而变化.这不能称作数组的复制,因为只是把地址赋过去了.地址一样,指向的是堆空间中唯一的数组实体(数值) ...
- 神经网络之卷积篇:详解Padding
详解Padding 为了构建深度神经网络,需要学会使用的一个基本的卷积操作就是padding,让来看看它是如何工作的. 如果用一个3×3的过滤器卷积一个6×6的图像,最后会得到一个4×4的输出,也就是 ...
- 1000T的文件怎么能快速从南京传到北京?最佳方案你肯定想不到
今天刷面试题看到一个有意思的面试题, 1000T的文件怎么能以最快速度从南京传到北京? 网络传输 首先我们考虑通过网络传输,需要多长时间. 我特地咨询了在运营商工作的同学,目前带宽: 家庭宽带下行最大 ...
- 新员工一口气写完了这些C语言例子,领导给他转正了!
持续更新中... 很多想从事嵌入式Linux开发的老铁问一口君,有没有快速提升自己编程水平的小例子? 一口君根据自己多年工作经验,整理了一些基于Linux的c语言的非常实用的小例子, 这些例子在嵌入式 ...
- MySQL 亿级数据平滑迁移实战
作者:来自 vivo 互联网服务器团队- Li Gang 本文介绍了一次 MySQL 数据迁移的流程,通过方案选型.业务改造.双写迁移最终实现了亿级数据的迁移. 一.背景 预约业务是 vivo 游戏中 ...
- 模板链表类的扩展(QListEx<T>)
以前写的链表都是比较简单的,插入节点是在头节点上,所以循环链表时都是从最后一个数据往前找的,给人的感觉是倒着的, 今天写一个在链表尾部插入数据 1.链表节点类的定义 /链表节点类 template & ...