Python代码实现双链表


Posted in Python onMay 25, 2022

本文实例为大家分享了Python代码实现双链表的具体代码,供大家参考,具体内容如下

双链表的每个节点有两个指针: 一个指向后一个节点,另一个指向前一个节点

class Node(object):
    def __init__(self, item=None):
        #放数据
        self.item= item
        #指向后一个节点
        self.next = None
        #指向前一个节点
        self.prior =None

此时当前链表第一个节点就是头节点指向的节点 20就是第一个节点 下图
node.next = self.head 当前节点指向原第一个节点

头插法

Python代码实现双链表

Python代码实现双链表

如何插入呢

Python代码实现双链表

Python代码实现双链表

Python代码实现双链表

插入

p.next = curNode.next #指向后一个节点
curNode.next.prior = p #指向前一个节点

Python代码实现双链表

删除

Python代码实现双链表

双链表删除

Python代码实现双链表

考虑特殊情况删除的

Python代码实现双链表

正常删除

Python代码实现双链表

双链表删除 30

Python代码实现双链表

#双链表头插法

Python代码实现双链表

#停在前一个位置了
count < (pos -1 )

#双向链表  从左往右读
class Node(object):
        """双向链表节点"""
        def __init__(self,item):
                #放数据的节点
                self.elem = item
                #指向后一个节点
                self.next = None
                #指向前一个节点
                self.prev = None
#双向链表
class LinkList(object):
        def __init__(self,node=None):
                #代表头节点
                self.__head = node

        #判断链表是否为空
        def is_empty(self):
                return self.__head == None

        def length(self):
                """返回链表的长度"""
                #cur游标移动,从而实现遍历元素的功能
                cur = self.__head
                #count用来计数
                count = 0
                while cur != None:
                        count += 1
                        #让cur游标可以向下移动
                        cur = cur.next
                return count

        #遍历整个链表
        def travel(self):
                if self.is_empty():
                        return
                #建立游标等于起始节点
                else:
                        cur = self.__head
                        while cur != None:
                                print(cur.elem,end=" ")
                                cur = cur.next
                        print("")

        #头插法
        def add(self,item):
                #新节点
                node = Node(item)
                if self.is_empty():
                        #头节点指向了新的节点
                        self.__head = node
                else:
                        #新节点指向原第一个节点
                        node.next = self.__head
                        self.__head = node
                        node.next.prev = node

        def append(self,item):
                """链表尾部添加元素"""
                node = Node(item)  #定义新节点
                #链表是否为空链表
                if self.is_empty():
                        #如果为空,新的节点加了进去
                        self.__head = node
                else:
                        #头节点 创建游标
                        cur = self.__head   #设置指向头结点的游标  此时的当前链表第一个节点,就是头节点指向的节点
                        #cur到最后一个节点停下
                        while cur.next != None:
                                cur = cur.next
                        #添加节点到尾部 cur道了最后一个结点  cur.next指向了新的节点node  从左往右读  
                        cur.next = node
                        #当前的节点指向它前一个
                        node.prev = cur

        #插入法  #pos从零开始
        def insert(self,pos,item):
                """在指定位置添加元素"""
                #指向不是头部元素,self.__head的地址
                # 为下一个元素,所以pre为下一个元素
                if pos <= 0:
                        #认为是头插法
                        self.add(item)
                #假如长度是3 pos大于2要特殊处理  
                elif pos > (self.length()-1):
                        #尾插法
                        self.append(item)
                else:
                        #创建节点 新节点
                        node = Node(item)
                        cur = self.__head
                        count = 0
                        #动起来
                        while count < pos:
                                count+=1
                                cur = cur.next
                       
                        #把节点链接到中间任意位置 插入前一个节点   此时,cur停在后一个节点
                        node.next = cur
                        node.prev = cur.prev
                        cur.prev.next = node
                        cur.prev = node

        def remove(self,item):
                """删除元素"""
                if self.is_empty():
                    return
                cur = self.__head
                #查找所有的位置有没有要删除的,若有则删除
                while cur != None:
                        #判断cur指向的数据,是否为要删除的数据   item要删除的元素
                        if cur.elem == item:
                                #判断此节点是否为头节点
                                #考虑特殊情况,恰好要删除是第一个元素    当前的元素就是我要删除的元素 
                                if cur == self.__head:
                                        #如果删除中间,  头节点指向后一个节点 
                                        self.__head = cur.next
                                        #考虑链表只有一个节点  直接指向None
                                        if cur.next != None:
                                                #是否只有一个节点
                                                cur.next.prev = None
                                else:
                                        #中间节点
                                        cur.prev.next = cur.next
                                        if cur.next != None:
                                                cur.next.prev = cur.prev
                                break
                        else:
                                #没有找到,cur游标向继续往下移动
                                cur = cur.next

        def search(self,item):
                """查找结点是否存在"""
                #如果是一个空链表
                if self.is_empty():
                        return False
                cur = self.__head
                while cur.next != self.__head:
                        #cur数据是否为查找的数据 item是要查的数据 
                        if cur.elem == item:
                                return True
                        else:
                                cur = cur.next
                #遍历完成 cur指向None
                return False

if __name__ == '__main__':
        ll = LinkList()
        #第一次的
        print(ll.is_empty())
        print(ll.length())

        ll.append(1)
        print(ll.is_empty())
        print(ll.length())

        ll.append(2)

        ll.append(3)
        ll.append(4)
        ll.append(5)
        ll.travel()
        ll.insert(-1,50)
        ll.travel()
        ll.insert(2,60)
        ll.travel()
        ll.insert(10,300)
        ll.travel()
        ll.remove(50)
        ll.travel()
        ll.remove(300)
        ll.travel()

Python代码实现双链表

以上就是本文的全部内容,希望对大家的学习有所帮助。


Tags in this post...

Python 相关文章推荐
python访问系统环境变量的方法
Apr 29 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
python模拟表单提交登录图书馆
Apr 27 Python
Python输出\u编码将其转换成中文的实例
Dec 15 Python
Python爬虫文件下载图文教程
Dec 23 Python
python实现邮件自动发送
Aug 10 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
python numpy--数组的组合和分割实例
Feb 24 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 Python
Python 中的函数装饰器和闭包详解
Feb 06 Python
python多次执行绘制条形图
Apr 20 Python
在python中读取和写入CSV文件详情
Jun 28 Python
详解NumPy中的线性关系与数据修剪压缩
python实现双链表
May 25 #Python
Python实现双向链表
May 25 #Python
python区块链持久化和命令行接口实现简版
May 25 #Python
python区块链实现简版工作量证明
May 25 #Python
pycharm无法安装cv2模块问题
May 20 #Python
python中 Flask Web 表单的使用方法
May 20 #Python
You might like
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
php数组删除元素示例
2014/03/21 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
jQuery技巧总结
2011/01/01 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
python调用百度语音REST API
2018/08/30 Python
详解Python字典的操作
2019/03/04 Python
在python shell中运行python文件的实现
2019/12/21 Python
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
文言文形式的学生求职信
2013/12/03 职场文书
自主招生自荐信范文
2013/12/04 职场文书
体育专业学生自我评价范文
2014/01/17 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
《最佳路径》教学反思
2014/04/13 职场文书
单位租车协议书
2015/01/29 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
Python绘制分类图的方法
2021/04/20 Python