双向链表的增、删、查、改、python实现,超详细讲解
双向链表的增、删、查、改
具体代码如下:
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实现,超详细讲解相关推荐
- 单链表的增、删、查、改、python实现,超详细讲解
单链表的python实现 代码增.删.查.改.及超详细注释: class Node(object):"""链表单节点实现"""def __i ...
- java 增 删 查 改_如何对java链表进行增、删、查、改操作
如何对java链表进行增.删.查.改操作 发布时间:2020-06-23 10:41:33 来源:亿速云 阅读:79 作者:Leah 如何对java链表进行增.删.查.改操作?针对这个问题,今天小编总 ...
- 单向循环链表的增、删、查、改、python实现,超详细讲解
单向循环链表的增.删.查.改 具体代码如下: class Node(object):"""链表单节点实现"""def __init__(se ...
- Python爬虫超详细讲解(零基础入门,老年人都看的懂)!
注重版权,转载请注明原作者和原文链接 作者:码农BookSea 原文链接:https://blog.csdn.net/bookssea/article/details/107309591 先看后赞,养 ...
- 快速排序 - python版超详细讲解
快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所 ...
- 100个python算法超详细讲解:抢30游戏
[100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...
- Python的零基础超详细讲解(第十三天)-Python的类与对象
基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...
- Python的零基础超详细讲解(第十二天)-Python函数及使用
基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...
- Python的零基础超详细讲解(第七天)-Python的数据的应用
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
最新文章
- 4天学会python_学习python第四天
- java 比特币私钥生成_如何生成自己的比特币私钥
- 命令行编译java项目_命令行编译运行java工程(转)
- 开发手记之实现web.config的快速配置(转载)
- SQL注入:3、无权读取information_schema库和拒绝union、order by语句
- 一直处于building “XXX”gradle project info
- WinForm 中自定义文件与自己的应用程序相关联
- 建设自己拥有的B2C网站一般需要什么样的插件以及大体花费
- mysql查询周边商铺_利用Redis的Geo功能实现查找附近的店铺
- oracle存储过程备份,Oracle存储过程(二)
- 文献笔记(5)(2017ISSCC 14.1)
- 论文1:《基于FPGA的机器学习硬件加速研究进展》阅读笔记
- 白苹果了怎么办_iOS更新白苹果处理及第三方售后吐槽
- GDrive首次现身!
- 云和恩墨校园招聘开始啦!
- 何海涛算法面试题感悟之九:寻找链…
- golang testing简介
- c语言抢票软件,12306网站探访记:一秒出票二百张抢票软件有用--财经--人民网...
- ERROR in static/js/0.5d7325513eec31f1e291.js from UglifyJs
- 神州数码c语言笔试题,2016年计算机笔试考试题及答案
热门文章
- C语言 · 龟兔赛跑预测
- Chrome开发者工具之JavaScript内存分析
- centos6.5+jexus5.6.3+mono 3.10实践,让asp.net在linux上飞一会儿
- Struts1中execute实现过滤控制
- 面试:Java分派机制
- Linux上开启TUN
- Docker快速搭建TeamSpeak多人语音聊天服务器
- 使用Linux curl命令获取本机公网IP地址
- NET Core 3.0 项目中使用 AutoFac
- MySQL报错 Packet for query is too large,server向mysql发送的数据包大小超过mysql限制