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 相关文章推荐
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
python实现发送邮件功能代码
Dec 14 Python
对Python3使运行暂停的方法详解
Feb 18 Python
详解python selenium 爬取网易云音乐歌单名
Mar 28 Python
Python流行ORM框架sqlalchemy安装与使用教程
Jun 04 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
Keras使用ImageNet上预训练的模型方式
May 23 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 Python
matplotlib 多个图像共用一个colorbar的实现示例
Sep 10 Python
python数据库批量插入数据的实现(executemany的使用)
Apr 30 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 Python
python双向链表实例详解
May 25 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中常量,变量的作用域和生存周期
2013/08/10 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
php异常处理使用示例
2014/02/25 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
学习ExtJS fit布局使用说明
2009/10/08 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
微信小程序使用wxParse解析html的实现示例
2018/08/30 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
python实现音乐下载的统计
2018/06/20 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
德国网上超市:myTime.de
2019/08/26 全球购物
校园自助餐厅的创业计划书
2013/12/26 职场文书
同学会主持词
2014/03/18 职场文书
新春联欢会主持词
2014/03/24 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书