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标准日志模块logging的使用方法
Nov 01 Python
python获取图片颜色信息的方法
Mar 18 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
Python2与Python3的区别实例总结
Apr 17 Python
Python中调用其他程序的方式详解
Aug 06 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
python 定义类时,实现内部方法的互相调用
Dec 25 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
python virtualenv虚拟环境配置与使用教程详解
Jul 13 Python
python实现按日期归档文件
Jan 30 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
php模板中出现空行解决方法
2011/03/08 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
php获取图片信息的方法详解
2015/12/10 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
js window.event对象详尽解析
2009/02/17 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
详解a++和++a的区别
2017/08/30 Javascript
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
基于python socketserver框架全面解析
2017/09/21 Python
Python命令行解析模块详解
2018/02/01 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
实践Vim配置python开发环境
2018/07/02 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
python获取array中指定元素的示例
2019/11/26 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
领导班子“四风问题”“整改方案
2014/10/02 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技