算法—详细讲解双向链表的实现(python)
双向链表
双向链表的实现
一、往链表的头部增加一个节点
# 新建一个节点node = Node(data)# 判断链表是否为空if self.is_empty():self.head = nodeelse:# 让链表中原本的头节点的prev指向新的节点self.head.prev = node# 先让node指向当前链表中的头节点node.next = self.head# 再让链表的head指向当前node节点self.head = node# 添加节点之后,链表的长度加1self._length += 1
二、链表尾部添加一个节点
node = Node(data)if self.head:cur = self.head # 将头节点的地址赋给了变量curwhile cur.next:cur = cur.nextnode.prev = cur # 让node的prev指针域去指向原本的尾节点cur.next = node # 让原本的尾节点的next指向新建的节点else:self.head = node# 让当前的尾节点的指针指向新建的节点node# 链表的长度加1self._length += 1
三、往链表指定位置插入一个节点,值为data
1新建一个节点node = Node(data)# 2找到链表中索引为pos-1的节点cur = self.headwhile pos - 1:cur = cur.nextpos -= 1# 到这里之后,cur指向的是索引为pos-1的节点# 让node的prev指向索引为pos-1的节点node.prev = cur# 让node的next指向索引为pos的节点cur.next.prev = node# 让索引为pos的节点指向新建的节点node.next = cur.next# 4让索引为pos-1的节点的next指向nodecur.next = node# 5链表的长度加1self._length += 1
四、删除链表中第一个值为data的节点
cur = self.headwhile cur:if cur.data == data:if cur == self.head:self.head = cur.nextelse:cur.prev.next = cur.nextif cur.next:cur.next.prev=cur.prevself._length -= 1return 0cur = cur.nextreturn -1
五、修改链表中指定位置节点的值
if 0 < pos < self._length:cur = self.headwhile pos:cur = cur.nextpos -= 1cur.data = dataelse:print('输入的范围不符合要求')
六、查找链表中是否有节点的值为data
cur=self.head
while cur:if cur.data==data:return 1else:cur=cur.next
return -1
代码块:
class Node:def __init__(self, data, _prev=None, _next=None):self.prev = _prev # 指针域,指向当前节点的前一个节点self.data = data # 数据域self.next = _next # 指针域 指向当前节点的后一个节点class DoubleLinkList:def __init__(self):self.head = None # 链表的的头节点self._length = 0 # 链表的长度,链表的元素个数def is_empty(self):# 判断链表的是否为空return self._length == 0def length(self):# 返回链表的长度return self._lengthdef nodes_list(self):# 返回链表中的所有节点的值组成的列表res = []cur = self.headwhile cur:res.append(cur.data)cur = cur.nextreturn resdef add(self, data):# 往链表的头部添加一个节点,值为data# 新建一个节点node = Node(data)# 判断链表是否为空if self.is_empty():self.head = nodeelse:# 让链表中原本的头节点的prev指向新的节点self.head.prev = node# 先让node指向当前链表中的头节点node.next = self.head# 再让链表的head指向当前node节点self.head = node# 添加节点之后,链表的长度加1self._length += 1def append(self, data):# 往链表的尾部添加一个节点,值为data# 新建一个节点node,值为datanode = Node(data)if self.head:cur = self.head # 将头节点的地址赋给了变量curwhile cur.next:cur = cur.nextnode.prev = cur # 让node的prev指针域去指向原本的尾节点cur.next = node # 让原本的尾节点的next指向新建的节点else:self.head = node# 让当前的尾节点的指针指向新建的节点node# 链表的长度加1self._length += 1def insert(self, pos, data):# 往链表的指定位置插入一个节点,值为dataif pos <= 0:self.add(data)elif pos > self._length:self.append(data)else:# 1新建一个节点node = Node(data)# 2找到链表中索引为pos-1的节点cur = self.headwhile pos - 1:cur = cur.nextpos -= 1# 到这里之后,cur指向的是索引为pos-1的节点# 让node的prev指向索引为pos-1的节点node.prev = cur# 让node的next指向索引为pos的节点cur.next.prev = node# 让索引为pos的节点指向新建的节点node.next = cur.next# 4让索引为pos-1的节点的next指向nodecur.next = node# 5链表的长度加1self._length += 1def remove(self, data):# 删除链表中第一个值为data的节点cur = self.headwhile cur:if cur.data == data:if cur == self.head:self.head = cur.nextelse:cur.prev.next = cur.nextif cur.next:cur.next.prev=cur.prevself._length -= 1return 0cur = cur.nextreturn -1def modify(self, pos, data):# 修改链表中指定位置节点的值if 0 < pos < self._length:cur = self.headwhile pos:cur = cur.nextpos -= 1cur.data = dataelse:print('输入的范围不符合要求')def search(self, data):# 查找链表中是否有节点的值为datacur = self.headwhile cur:if cur.data == data:return Truecur = cur.nextreturn Falseif __name__ == '__main__':l1 = DoubleLinkList() # 新建一个链表类print(l1.head, l1.length())l1.add(1)print(l1.nodes_list())l1.append(2)print(l1.nodes_list())l1.append(3)print(l1.nodes_list())l1.insert(1, 8)print(l1.nodes_list())l1.remove(2)print(l1.nodes_list())l1.remove(1)print(l1.nodes_list())l1.modify(1,7)print(l1.nodes_list())print(l1.search(7))
算法—详细讲解双向链表的实现(python)相关推荐
- 模拟退火算法详细讲解(含实例python代码)
模拟退火算法详细讲解(含实例python代码) (一)模拟退火算法简介 (二)模拟退火算法原理 (三)退火过程中参数控制 (四)算法步骤 (五)实例分析 最近老师要求做模拟退火算法实验,看了很多博客之 ...
- dijkstra标号法表格_Dijkstra算法详细讲解
最短路径之 Dijkstra 算法详细讲解 1 最短路径算法 在日常生活中,我们如果需要常常往返 A 地区和 B 地区之间,我们最希望 知道的可能是从 A 地区到 B 地区间的众多路径中,那一条路径的 ...
- lamport面包店算法详细讲解及代码实现
lamport面包店算法详细讲解及代码实现 1 算法详解 1.1 一个较为直观的解释 1.2 Lamport算法的时间戳原理 1.3 Lamport算法的5个原则 1.4 一个小栗子 2 算法实现 3 ...
- Adaboost算法详细讲解
转自线上数据建模 Adaboost算法详细讲解 Adaboost(Adaptive Boosting): Adaboost是Boosting模型,和bagging模型(随机森林)不同的是:Adaboo ...
- Python的零基础超详细讲解(第十二天)-Python函数及使用
基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...
- C语言老鼠走迷宫(单路径)算法详细讲解
最近在学习C语言的一些经典算法,其中遇到了一点困难,导致卡进度了.琢磨了很久,在绘制流程图时,突然灵感大开理解了,老鼠走迷宫算法的奇妙.所以写了这个,一来是方便以后右和我类似的同学自学时,遇到这个问题 ...
- Dijkstra算法 详细讲解
Dijkstra算法 详细解释 Dijkstra算法适用于边权值为正的情况,如果边权值为负数就才用另一种最短路算法Bellman-Ford算法. 该算法是指从单个源点到各个结点的最短路,该算法适用于有 ...
- 排序算法详细讲解(超酷)
目录 前言 一.插入类排序 1.直接插入排序 2.折半插入排序 3.希尔排序 二.交换类排序 1.冒泡排序(相邻比序法) 2.快速排序 三.选择类排序 1.简单选择排序 2.树形选择排序 3.堆排序 ...
- 算法—详细讲解单向循环链表的实现(python)
单向循环列表如图所示 单向循环链表的实现 一.往链表头部添加一个节点值为4 1.新增一个节点node=Node(4) 新建一个节点 node=Node(data)if self.is_empty(): ...
最新文章
- 有了Anaconda如何安装Pycharm以及简单使用和调试
- OSChina 周日乱弹 ——身价上亿,然而找不到女朋友 你信么?
- Java魔法堂:枚举类型详解
- 微信小程序知识点梳理
- sql的error如何查看是什么故障_什么是420mA控制回路?常见故障如何排查?
- Workbooks 对象的 Open 方法参数说明
- sql 查询所有数据库-表-表结构
- 原来AI也可以如此简单!教你从0到1开发开源知识问答机器人
- Android 实践项目开发二
- 数字IC后端设计实现流程之floorplan及powerplan规划
- 古文观止 —— 千古名篇
- 字体管家射手座 - 绿斗堂字体网
- 分不清蓝牙适配器、蓝牙接收器和蓝牙发射器?伦茨科技为你讲解
- 董明珠表示“格力不能更好运营,我绝不交班”,现实由不得她
- CPU,GPU,TPU,NPU都是什么?
- sqlserver导入mdf文件
- windows计算机操作题,计算机等级考试Windows操作题
- 经典算法问题-01-八皇后
- GeoGebra2笔记:二维或三维画图
- EBS中如何实现简单的日记账导入
热门文章
- linux cisco路由器,怎样让linux做cisco路由器的专用日志服务器
- 美媒:谷歌巨型数据中心和美国小镇“抢水”
- 2025年全球结构化布线市场预计将达到165亿美元
- 新基建数据中心如何建?附建设导则
- word受权限保护无法打开_双击文档无法打开到底是啥毛病?简单一招解决
- 成功解决ValueError: (‘Unknown transform primitive years. ‘, ‘Call ft.primitives.list_primitives() to get
- DL之GCN:GCN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- 成功解决\h5py\__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float
- ML之4PolyR:利用四次多项式回归4PolyR模型+两种正则化(Lasso/Ridge)在披萨数据集上拟合(train)、价格回归预测(test)
- ML之回归预测:机器学习中的各种Regression回归算法、关键步骤配图