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实现的jpg格式图片修复代码
Apr 21 Python
基于wxpython开发的简单gui计算器实例
May 30 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
Django 前后台的数据传递的方法
Aug 08 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
sublime python3 输入换行不结束的方法
Apr 19 Python
解决python matplotlib imshow无法显示的问题
May 24 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
Python阶乘求和的代码详解
Feb 14 Python
Python pip安装第三方库实现过程解析
Jul 09 Python
Python实现冒泡排序算法的完整实例
Nov 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
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
Vuepress 搭建带评论功能的静态博客的实现
2019/02/17 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
Python 字符串操作方法大全
2014/03/11 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
Python列表解析配合if else的方法
2018/06/23 Python
python3.x实现base64加密和解密
2019/03/28 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
食品营养与检测应届生求职信
2013/11/08 职场文书
师范大学应届生求职信
2013/11/21 职场文书
护理专业自我鉴定
2014/01/30 职场文书
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
教师节主题班会方案
2015/08/17 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书