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 相关文章推荐
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
Nov 07 Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 Python
Python爬取12306车次信息代码详解
Aug 12 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
详解python3 GUI刷屏器(附源码)
Feb 18 Python
python中Pexpect的工作流程实例讲解
Mar 02 Python
Python 调用C++封装的进一步探索交流
Mar 04 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
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
PHP操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
php实现微信扫码支付
2017/03/26 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
js直接编辑当前cookie的脚本
2008/09/14 Javascript
jQuery 表格工具集
2010/04/25 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
vc6编写python扩展的方法分享
2014/01/17 Python
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python部署web开发程序的几种方法
2017/05/05 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
在双python下设置python3为默认的方法
2018/10/31 Python
pyshp创建shp点文件的方法
2018/12/31 Python
ASP.NET Core中的配置详解
2021/02/05 Python
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
投资合作协议书范本
2014/04/17 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
校园广播稿100字
2014/10/06 职场文书
教师个人发展总结
2015/02/11 职场文书
大学毕业生个人总结
2015/02/28 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书