# 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. 【Mybatis】01 概述 & 快速入门Part1

    什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作. MyB ...

  2. 【SpringCloud】Re04 Gateway

    微服务网关: 1.身份认证 和 权限校验 2.服务路由.负载均衡 3.请求限流 搭建服务网关: 网关是一个独立的服务,同样需要被注册中心注册到,这里依然使用的是Nacos <?xml versi ...

  3. 【Windows】更改Win10字体和Cmd字体

    教程参考: https://www.windowszj.com/news/20837.html Win + R 打开运行窗口 输入 regedit 打开注册表编辑窗口 位置地址: 计算机\HKEY_L ...

  4. conda环境下Python报错:raise MissingCUDAException("CUDA_HOME does not exist, unable to compile CUDA op(s)") CUDA_HOME does not exist, unable to compile CUDA op(s)

    conda环境下Python报错: (pytorch) devil@Monster:~$ pip install deepspeed Collecting deepspeed Using cached ...

  5. 国产软件如何让人再次失望——!20824 mindspore1.3.0gpu version can not compile from source code, because openmpi source code has bug

    如题,该PR地址: https://gitee.com/mindspore/mindspore/pulls/20824#note_7053720 What type of PR is this? Un ...

  6. Ubuntu系统中CUDA套件nvvp启动后报错Failed to load module "canberra-gtk-module"

    最近在看cuda方面的内容,需要对cuda代码做一些性能分析,于是需要使用nvvp,但是启动nvvp后报错:Failed to load module "canberra-gtk-modul ...

  7. mybatis-plus系统化学习之查询专题

    1.背景 查询在实际生产中用得最多,也最灵活. 2.查询案例 表结构: CREATE TABLE `sys_user` ( `id` int(32) NOT NULL AUTO_INCREMENT C ...

  8. 如何在通用异常处理时获取到方法名称(获取注解参数JoinPoint)

    1.背景 很多时候我们在梳理公共异常时,需要获取到接口的而具体名称,便于很好的提示是那个接口错误了 2.实现逻辑 1.在controller方法上的注解上写方法名称,一般使用了swagger都有方法名 ...

  9. 【题解】ABC365(A~E)

    前四题30min切,然后T5死磕70min+几发小唐错,距离比赛结束还有16s交最后一发,AC了. 目录 A. Leap Year 题目描述 思路 代码 B. Second Best 题目描述 思路 ...

  10. React 18 自定义 Hook 获取 useState 最新值

    原理:通过同步更新 useRef  来获取最新值 // util.ts export const useRefState = (init: any = null) => { const [sta ...