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 相关文章推荐
Python3中多线程编程的队列运作示例
Apr 16 Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
python 不同方式读取文件速度不同的实例
Nov 09 Python
python实现年会抽奖程序
Jan 22 Python
pyqt 实现在Widgets中显示图片和文字的方法
Jun 13 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
Series和DataFrame使用简单入门
Nov 13 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 Python
python中mongodb包操作数据库
Apr 19 Python
python pygame 开发五子棋双人对弈
May 02 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
js静态方法与实例方法分析
2011/07/04 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
js创建对象的方式总结
2015/01/10 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
使用JQuery实现图片轮播效果的实例(推荐)
2017/10/24 jQuery
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
使用Template格式化Python字符串的方法
2019/01/22 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
技能比赛获奖感言
2014/02/14 职场文书
房屋买卖协议样本
2014/11/16 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
红色电影观后感
2015/06/18 职场文书
新闻通讯稿范文
2015/07/22 职场文书
试了下Golang实现try catch的方法
2021/07/01 Golang
Axios代理配置及封装响应拦截处理方式
2022/04/07 Vue.js