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正则表达式及使用正则表达式的例子
Jan 22 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
Apr 18 Python
python3+PyQt5实现文档打印功能
Apr 24 Python
python 图片去噪的方法示例
Jul 09 Python
python过滤中英文标点符号的实例代码
Jul 15 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 Python
Python更改pip镜像源的方法示例
Dec 01 Python
Python制作简单的剪刀石头布游戏
Dec 10 Python
Django migrate报错的解决方案
May 20 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 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
基于flush()不能按顺序输出时的解决办法
2013/06/29 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
js实现百度淘宝搜索功能
2020/02/17 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
JPype实现在python中调用JAVA的实例
2017/07/19 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
营业经理岗位职责
2013/11/10 职场文书
好家长事迹材料
2014/01/23 职场文书
库房管理员岗位职责
2014/03/09 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
倡议书格式模板
2014/05/13 职场文书
2014年药房工作总结
2014/11/22 职场文书
锅炉工岗位职责
2015/02/13 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技