双向链表

双向链表的实现

一、往链表的头部增加一个节点

    # 新建一个节点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)相关推荐

  1. 模拟退火算法详细讲解(含实例python代码)

    模拟退火算法详细讲解(含实例python代码) (一)模拟退火算法简介 (二)模拟退火算法原理 (三)退火过程中参数控制 (四)算法步骤 (五)实例分析 最近老师要求做模拟退火算法实验,看了很多博客之 ...

  2. dijkstra标号法表格_Dijkstra算法详细讲解

    最短路径之 Dijkstra 算法详细讲解 1 最短路径算法 在日常生活中,我们如果需要常常往返 A 地区和 B 地区之间,我们最希望 知道的可能是从 A 地区到 B 地区间的众多路径中,那一条路径的 ...

  3. lamport面包店算法详细讲解及代码实现

    lamport面包店算法详细讲解及代码实现 1 算法详解 1.1 一个较为直观的解释 1.2 Lamport算法的时间戳原理 1.3 Lamport算法的5个原则 1.4 一个小栗子 2 算法实现 3 ...

  4. Adaboost算法详细讲解

    转自线上数据建模 Adaboost算法详细讲解 Adaboost(Adaptive Boosting): Adaboost是Boosting模型,和bagging模型(随机森林)不同的是:Adaboo ...

  5. Python的零基础超详细讲解(第十二天)-Python函数及使用

    基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...

  6. C语言老鼠走迷宫(单路径)算法详细讲解

    最近在学习C语言的一些经典算法,其中遇到了一点困难,导致卡进度了.琢磨了很久,在绘制流程图时,突然灵感大开理解了,老鼠走迷宫算法的奇妙.所以写了这个,一来是方便以后右和我类似的同学自学时,遇到这个问题 ...

  7. Dijkstra算法 详细讲解

    Dijkstra算法 详细解释 Dijkstra算法适用于边权值为正的情况,如果边权值为负数就才用另一种最短路算法Bellman-Ford算法. 该算法是指从单个源点到各个结点的最短路,该算法适用于有 ...

  8. 排序算法详细讲解(超酷)

    目录 前言 一.插入类排序 1.直接插入排序 2.折半插入排序 3.希尔排序 二.交换类排序 1.冒泡排序(相邻比序法) 2.快速排序 三.选择类排序 1.简单选择排序 2.树形选择排序 3.堆排序 ...

  9. 算法—详细讲解单向循环链表的实现(python)

    单向循环列表如图所示 单向循环链表的实现 一.往链表头部添加一个节点值为4 1.新增一个节点node=Node(4) 新建一个节点 node=Node(data)if self.is_empty(): ...

最新文章

  1. 有了Anaconda如何安装Pycharm以及简单使用和调试
  2. OSChina 周日乱弹 ——身价上亿,然而找不到女朋友 你信么?
  3. Java魔法堂:枚举类型详解
  4. 微信小程序知识点梳理
  5. sql的error如何查看是什么故障_什么是420mA控制回路?常见故障如何排查?
  6. Workbooks 对象的 Open 方法参数说明
  7. sql 查询所有数据库-表-表结构
  8. 原来AI也可以如此简单!教你从0到1开发开源知识问答机器人
  9. Android 实践项目开发二
  10. 数字IC后端设计实现流程之floorplan及powerplan规划
  11. 古文观止 —— 千古名篇
  12. 字体管家射手座 - 绿斗堂字体网
  13. 分不清蓝牙适配器、蓝牙接收器和蓝牙发射器?伦茨科技为你讲解
  14. 董明珠表示“格力不能更好运营,我绝不交班”,现实由不得她
  15. CPU,GPU,TPU,NPU都是什么?
  16. sqlserver导入mdf文件
  17. windows计算机操作题,计算机等级考试Windows操作题
  18. 经典算法问题-01-八皇后
  19. GeoGebra2笔记:二维或三维画图
  20. EBS中如何实现简单的日记账导入

热门文章

  1. linux cisco路由器,怎样让linux做cisco路由器的专用日志服务器
  2. 美媒:谷歌巨型数据中心和美国小镇“抢水”
  3. 2025年全球结构化布线市场预计将达到165亿美元
  4. 新基建数据中心如何建?附建设导则
  5. word受权限保护无法打开_双击文档无法打开到底是啥毛病?简单一招解决
  6. 成功解决ValueError: (‘Unknown transform primitive years. ‘, ‘Call ft.primitives.list_primitives() to get
  7. DL之GCN:GCN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  8. 成功解决\h5py\__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float
  9. ML之4PolyR:利用四次多项式回归4PolyR模型+两种正则化(Lasso/Ridge)在披萨数据集上拟合(train)、价格回归预测(test)
  10. ML之回归预测:机器学习中的各种Regression回归算法、关键步骤配图