python实现双向链表原理


Posted in Python onMay 25, 2022

双向链表

一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。

python实现双向链表原理

操作

is_empty() 链表是否为空
length() 链表长度
travel() 遍历链表
add(item) 链表头部添加
append(item) 链表尾部添加
insert(pos, item) 指定位置添加
remove(item) 删除节点
search(item) 查找节点是否存在

实现

class Node(object):
    """双向链表节点"""
    def __init__(self, item):
        self.item = item
        self.next = None
        self.prev = None


class DLinkList(object):
    """双向链表"""
    def __init__(self):
        self.__head = None

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

    def length(self):
        """返回链表的长度"""
        cur = self.__head
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        """遍历链表"""
        cur = self.__head
        while cur != None:
            print cur.item,
            cur = cur.next
        print ""

    def add(self, item):
        """头部插入元素"""
        node = Node(item)
        if self.is_empty():
            # 如果是空链表,将_head指向node
            self.__head = node
        else:
            # 将node的next指向_head的头节点
            node.next = self.__head
            # 将_head的头节点的prev指向node
            self.__head.prev = node
            # 将_head 指向node
            self.__head = node

    def append(self, item):
        """尾部插入元素"""
        node = Node(item)
        if self.is_empty():
            # 如果是空链表,将_head指向node
            self.__head = node
        else:
            # 移动到链表尾部
            cur = self.__head
            while cur.next != None:
                cur = cur.next
            # 将尾节点cur的next指向node
            cur.next = node
            # 将node的prev指向cur
            node.prev = cur

    def search(self, item):
        """查找元素是否存在"""
        cur = self.__head
        while cur != None:
            if cur.item == item:
                return True
            cur = cur.next
        return False

指定位置插入节点

python实现双向链表原理

def insert(self, pos, item):
        """在指定位置添加节点"""
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            node = Node(item)
            cur = self.__head
            count = 0
            # 移动到指定位置的前一个位置
            while count < (pos-1):
                count += 1
                cur = cur.next
            # 将node的prev指向cur
            node.prev = cur
            # 将node的next指向cur的下一个节点
            node.next = cur.next
            # 将cur的下一个节点的prev指向node
            cur.next.prev = node
            # 将cur的next指向node
            cur.next = node

删除元素

python实现双向链表原理

def remove(self, item):
        """删除元素"""
        cur = self.__head
        while cur != None:
            # 找到了要删除的元素
            if cur.item == item:
                # 先判断此结点是否是头节点
                # 头节点
                if cur == self.__head:
                    self.__head = cur.next
                    # 如果存在下一个结点,则设置下一个结点
                    if cur.next:
                        # 判断链表是否只有一个结点
                        cur.next.prev = None
                else:
                    cur.prev.next = cur.next
                    # 如果存在下一个结点,则设置下一个结点
                    if cur.next:
                        cur.next.prev = cur.prev
                break
            else:
                cur = cur.next

测试

if __name__ == "__main__":
    ll = DLinkList()
    ll.add(1)
    ll.add(2)
    ll.append(3)
    ll.insert(2, 4)
    ll.insert(4, 5)
    ll.insert(0, 6)
    print "length:",ll.length()
    ll.travel()
    print ll.search(3)
    print ll.search(4)
    ll.remove(1)
    print "length:",ll.length()
    ll.travel()

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


Tags in this post...

Python 相关文章推荐
python提取页面内url列表的方法
May 25 Python
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 Python
Python基于checksum计算文件是否相同的方法
Jul 09 Python
python利用lxml读写xml格式的文件
Aug 10 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
pymongo中group by的操作方法教程
Mar 22 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
Feb 06 Python
python3 正则表达式基础廖雪峰
Mar 25 Python
python安装读取grib库总结(推荐)
Jun 24 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 Python
Python爬虫基础讲解之请求
May 13 Python
python flask框架快速入门
May 14 Python
Python代码实现双链表
详解NumPy中的线性关系与数据修剪压缩
python实现双链表
May 25 #Python
Python实现双向链表
May 25 #Python
python区块链持久化和命令行接口实现简版
May 25 #Python
python区块链实现简版工作量证明
May 25 #Python
pycharm无法安装cv2模块问题
May 20 #Python
You might like
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
Javascript简单改变表单元素背景的方法
2015/07/15 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
python里glob模块知识点总结
2021/01/05 Python
高中校园广播稿
2014/01/11 职场文书
《愚公移山》教学反思
2014/02/20 职场文书
增员口号大全
2014/06/18 职场文书
初中学校对照检查材料
2014/08/19 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
小学班级特色活动方案
2014/08/31 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
担保书范文
2019/07/09 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android