Python实现双向链表基本操作


Posted in Python onMay 25, 2022

双向链表的基本操作的实现,供大家参考,具体内容如下

在之前的博客中介绍了三种链表,分别是单链表、单向循环链表以及双向链表。本篇博客将用Python来实现双向链表的如下操作。(用到的工具是Python 3)

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

Python实现

class Node(object):
    '''双向链表节点'''
    def __init__(self,item):
        self.item = item
        self.next = None
        self.prev = None
class DoubleLink(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指向None
            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():
            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()
            cur = self._head()
            count = 0
            # 移动到指定的前一个位置
            while cur < 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):
        '''删除元素'''
        if self.is_empty(): return 
        else:
            cur = self._head
            if cur.item == item:
                # 如果首节点的元素是要删除的元素
                if cur.next == None:
                    # 如果链表中只有一个节点
                    self._head = None
                else:
                    cur.next.prev = None
                    self._head = cur.next
                return
            while cur != None:
                if cur.item == item:
                    cur.prev.next = cur.next
                    cur.next.prev = cur.prev
                    break
                cur = cur.next

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


Tags in this post...

Python 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
深入理解 Python 中的多线程 新手必看
Nov 20 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
Jan 18 Python
python 读入多行数据的实例
Apr 19 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
快速解决docker-py api版本不兼容的问题
Aug 30 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
基于python实现图片转字符画代码实例
Sep 04 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 Python
python实现双向链表原理
May 25 #Python
Python代码实现双链表
详解NumPy中的线性关系与数据修剪压缩
python实现双链表
May 25 #Python
Python实现双向链表
May 25 #Python
python区块链持久化和命令行接口实现简版
May 25 #Python
python区块链实现简版工作量证明
May 25 #Python
You might like
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
深入php多态的实现详解
2013/06/09 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
jquery选择器简述
2015/08/31 Javascript
理解JS事件循环
2016/01/07 Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
2016/08/02 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
利用纯js + transition动画实现移动端web轮播图详解
2017/09/10 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
vue.js的简单自动求和计算实例
2019/11/08 Javascript
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
django 修改server端口号的方法
2018/05/14 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
django正续或者倒序查库实例
2020/05/19 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
2014年十一国庆节活动方案
2014/09/16 职场文书
班主任工作实习计划
2015/01/16 职场文书
厉行节约工作总结
2015/08/12 职场文书
八年级作文之感恩
2019/11/22 职场文书
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android