双向链表的增、删、查、改


具体代码如下:

class Node(object):"""链表单节点实现"""def __init__(self, item):self.item = item  # 元素域self.next = None  # 尾链接域self.pre = None  # 前驱指针class DoubleLink:"""双向链表"""def __init__(self, node=None):self.__head = node# head为指向一个链表头结点的p变量,接收一个参数node,node就是一个结点(第一个结点),当然也可以不传参数,# 当做一个空链表# head设置成私有属性,防止外部访问,如果head被外部访问并改动,则head之前指向的链表就丢失找不到了def is_empty(self):"""判断链表是否为空:return 如果链表为空, 返回真"""return self.__head is Nonedef length(self):""":return: 链表长度 cur 游标count 结点计数"""cur = self.__head  # 设置游标指向第一个结点count = 0  # 计数初始值为:0while cur is not None:  # 如果游标指向的结点不为空则进入循环进行计数count += 1  # 每次加一cur = cur.next  # 如果cur不为空则让游标指向下一个结点return count  # 最后返回链表长度def travel(self):"""遍历链表:return:打印链表所有元素"""cur = self.__headwhile cur is not None:print(cur.item, end=" ")cur = cur.nextprint()def add(self, item):"""在链表头部添加结点:param item: 结点元素:return: """node = Node(item)  # 创建一个结点对象if self.is_empty():  # 如果原始链表为空,直接让head指向新结点就可以了self.__head = nodeelse:node.next = self.__head  # 让新结点的next指向原始的第一个结点self.__head.pre = node   # 让原始结点的pre指向新节点self.__head = node  # 让头指针指向新加入的结点def append(self, item):"""在链表的尾部追加结点:param item: :return: """node = Node(item)#  如果链表为空则需要特殊处理if self.is_empty():self.__head = nodeelse:cur = self.__headwhile cur.next is not None:cur = cur.nextcur.next = node  # 让原始结点的为指针指向nodenode.pre = cur      # 让node的前驱指针指向原始尾结点def insert(self, pos, item):"""在指定位置插入元素:param item: :return: """if pos <= 0:  # 如果要插入的位置小于等于0,则相当于在头部加入结点self.add(item)  # 直接调用已经写好的方法elif pos >= self.length():  # 如果要插入的位置大于等于链表的长度,则相当于在链表的尾部追加元素self.append(item)  # 直接调用写好的方法else:  # 如果插入位置在链表中间则进行一下操作cur = self.__head  # 游标指向第一个结点count = 0  # 计数制0while count < (pos - 1):  # (pos - 1) cur需要停留在pos位置的前一个结点的位置cur = cur.nextcount += 1# 当退出循环的时候cur指向pos的前一个位置node = Node(item)  # 创建新结点# TODO 如果四个指针复制的顺序出错会造成死循环(如下:)"""cur.next = node  # 将cur指向新结点]node.pre = curnode.next = cur.next  # 将新结点指向cur的下一个结点cur.next.pre = node   # 让cur的后一个结点的pre指向node"""node.pre = curnode.next = cur.next  # 将新结点指向cur的下一个结点cur.next.pre = node   # 让cur的后一个结点的pre指向nodecur.next = node  # 将cur指向新结点]def remove(self, item):"""删除结点"""cur = self.__headwhile cur is not None:  # 如果cur不为空则进入循环# 找到了要删除的元素if cur.item == item:# 在头部找到了元素if cur == self.__head:  # 如果找到的元素在头结点上self.__head = cur.next  # 让头结点指向下一个结点,丢弃上个结点if cur.next:cur.next.pre = None  # 将原始头结点删除后将下一个结点的pre指向空else:  # 找到的结点不在头结点上,cur.pre.next = cur.nextif cur.next:cur.next.pre = cur.prereturn  # 删除后直接结束循环cur = cur.nextdef search(self, item):"""查找结点是否存在:return 布尔型"""cur = self.__headwhile cur is not None:if cur.item == item:return True  # 如果找到了目标结点就返回truecur = cur.nextreturn False  # 如果整个循环结束也没有找到目标结点,就返回falseif __name__ == '__main__':link = DoubleLink()print(link.length())print(link.is_empty())link.add(1)link.travel()link.append(6)link.travel()link.insert(1, 3)link.travel()print(link.length())print(link.search(1))link.remove(3)link.travel()link.remove(6)link.remove(1)print(link.length())

双向链表的增、删、查、改、python实现,超详细讲解相关推荐

  1. 单链表的增、删、查、改、python实现,超详细讲解

    单链表的python实现 代码增.删.查.改.及超详细注释: class Node(object):"""链表单节点实现"""def __i ...

  2. java 增 删 查 改_如何对java链表进行增、删、查、改操作

    如何对java链表进行增.删.查.改操作 发布时间:2020-06-23 10:41:33 来源:亿速云 阅读:79 作者:Leah 如何对java链表进行增.删.查.改操作?针对这个问题,今天小编总 ...

  3. 单向循环链表的增、删、查、改、python实现,超详细讲解

    单向循环链表的增.删.查.改 具体代码如下: class Node(object):"""链表单节点实现"""def __init__(se ...

  4. Python爬虫超详细讲解(零基础入门,老年人都看的懂)!

    注重版权,转载请注明原作者和原文链接 作者:码农BookSea 原文链接:https://blog.csdn.net/bookssea/article/details/107309591 先看后赞,养 ...

  5. 快速排序 - python版超详细讲解

    快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所 ...

  6. 100个python算法超详细讲解:抢30游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...

  7. Python的零基础超详细讲解(第十三天)-Python的类与对象

    基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...

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

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

  9. Python的零基础超详细讲解(第七天)-Python的数据的应用

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

最新文章

  1. 4天学会python_学习python第四天
  2. java 比特币私钥生成_如何生成自己的比特币私钥
  3. 命令行编译java项目_命令行编译运行java工程(转)
  4. 开发手记之实现web.config的快速配置(转载)
  5. SQL注入:3、无权读取information_schema库和拒绝union、order by语句
  6. 一直处于building “XXX”gradle project info
  7. WinForm 中自定义文件与自己的应用程序相关联
  8. 建设自己拥有的B2C网站一般需要什么样的插件以及大体花费
  9. mysql查询周边商铺_利用Redis的Geo功能实现查找附近的店铺
  10. oracle存储过程备份,Oracle存储过程(二)
  11. 文献笔记(5)(2017ISSCC 14.1)
  12. 论文1:《基于FPGA的机器学习硬件加速研究进展》阅读笔记
  13. 白苹果了怎么办_iOS更新白苹果处理及第三方售后吐槽
  14. GDrive首次现身!
  15. 云和恩墨校园招聘开始啦!
  16. 何海涛算法面试题感悟之九:寻找链…
  17. golang testing简介
  18. c语言抢票软件,12306网站探访记:一秒出票二百张抢票软件有用--财经--人民网...
  19. ERROR in static/js/0.5d7325513eec31f1e291.js from UglifyJs
  20. 神州数码c语言笔试题,2016年计算机笔试考试题及答案

热门文章

  1. C语言 · 龟兔赛跑预测
  2. Chrome开发者工具之JavaScript内存分析
  3. centos6.5+jexus5.6.3+mono 3.10实践,让asp.net在linux上飞一会儿
  4. Struts1中execute实现过滤控制
  5. 面试:Java分派机制
  6. Linux上开启TUN
  7. Docker快速搭建TeamSpeak多人语音聊天服务器
  8. 使用Linux curl命令获取本机公网IP地址
  9. NET Core 3.0 项目中使用 AutoFac
  10. MySQL报错 Packet for query is too large,server向mysql发送的数据包大小超过mysql限制