python双向链表原理与实现方法详解


Posted in Python onDecember 03, 2019

本文实例讲述了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

指定位置插入节点

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

删除元素

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

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中easy_install 和 pip 的安装及使用
Jun 05 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
Nov 29 Python
Python数字图像处理之霍夫线变换实现详解
Jan 12 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
python 读写文件,按行修改文件的方法
Jul 12 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
了解不常见但是实用的Python技巧
May 23 Python
使用celery执行Django串行异步任务的方法步骤
Jun 06 Python
Python爬虫学习之翻译小程序
Jul 30 Python
详解python内置模块urllib
Sep 09 Python
python安装mysql的依赖包mysql-python操作
Jan 01 Python
详细总结Python常见的安全问题
May 21 Python
Python读取实时数据流示例
Dec 02 #Python
简单了解python元组tuple相关原理
Dec 02 #Python
python实现智能语音天气预报
Dec 02 #Python
Python:二维列表下标互换方式(矩阵转置)
Dec 02 #Python
python 实现二维列表转置
Dec 02 #Python
python列表推导式入门学习解析
Dec 02 #Python
Python 矩阵转置的几种方法小结
Dec 02 #Python
You might like
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
AngularJS入门之动画
2016/07/27 Javascript
vue.js实现请求数据的方法示例
2017/02/07 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
python实现图像识别功能
2018/01/29 Python
在Python中表示一个对象的方法
2019/06/25 Python
Django实现发送邮件功能
2019/07/18 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
小学毕业典礼演讲稿
2014/09/09 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
教师年度个人总结
2015/02/11 职场文书
保送生自荐信范文
2015/03/26 职场文书
离职证明格式样本
2015/06/12 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
初中生物教学反思
2016/02/20 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
Python使用openpyxl模块处理Excel文件
2022/06/05 Python