# 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. 【Java】Reflection 反射机制 02获取类的一切

    先创建一个可演示的类 注解类 package cn.dai.Reflection.demo; import java.lang.annotation.ElementType; import java. ...

  2. 【Vue】Re03 computed属性计算和ES6的一些补充

    一.Computed属性计算 四种计算处理的方式方法 <!DOCTYPE html> <html lang="en"> <head> <m ...

  3. Ubuntu 18.04.4 安装docker18.09 (使用阿里云的源)

    由于AI_Station 是使用容器构建环境的,而且只提供镜像上传下载功能,不为容易提供网络功能,因此需要在平台上把镜像拉取到本地,并安装一些必备软件然后再打包成镜像上传回去,因此需要在本地构建doc ...

  4. 中国版的huggingface——始智AI-wisemodel

    新闻: 始智AI-wisemodel社区正式上线,目标打造中国版"HuggingFace" 首先要知道,AI火热了7,8年了,不论是国内还是国外一直有要搞模型分享的网站,但是这东西 ...

  5. 【转载】 Python Pillow 和 cv2 图片 resize 速度的比较

    原文地址: https://zhuanlan.zhihu.com/p/91078855 -------------------------------------------------------- ...

  6. 编程语言mojo报错:error: cannot call function that may raise in a context that cannot raise

    代码: from python import Python fn main(): # fn main() raises: # This is equivalent to Python's `impor ...

  7. Python网页应用开发神器fac 0.3.0全新版本发布

    大家好我是费老师,在Python生态中,有很多以Python为主要开发语言,实现网页应用开发的框架,其中最为知名的有Dash.flet.streamlit.gradio.nicegui等. 如果综合考 ...

  8. RabbitMq消息可靠性之确认模式 通俗易懂 超详细 【内含案例】

    RabbitMq保证消息可靠性之确认模式 介绍 消息的确认,是指生产者投递消息后,如果 Broker 收到消息,则会给我们生产者一个应答.生产者进行接收应答,用来确定这条消息是否正常的发送到 Brok ...

  9. 从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章)

    从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章) 1.简介 该项目整合了编程.AI.产品设计.商业科技及个人成长等多领域的精华内容,源自顶 ...

  10. Java并发编程学习前期知识上篇

    Java并发编程学习前期知识上篇 我们先来看看几个大厂真实的面试题: 从上面几个真实的面试问题来看,我们可以看到大厂的面试都会问到并发相关的问题.所以 Java并发,这个无论是面试还是在工作中,并发都 ...