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写的创建文件夹自定义函数mkdir()
Aug 25 Python
python基础教程之缩进介绍
Aug 29 Python
python3实现暴力穷举博客园密码
Jun 19 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
Face++ API实现手势识别系统设计
Nov 21 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
浅析python redis的连接及相关操作
Nov 07 Python
Pytorch Tensor 输出为txt和mat格式方式
Jan 03 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
Python unittest单元测试框架及断言方法
Apr 15 Python
利用python绘制正态分布曲线
Jan 04 Python
用Python仅20行代码编写一个简单的端口扫描器
Apr 08 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
使用adodb lite解决问题
2006/12/31 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
php绘制一个扇形的方法
2015/01/24 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
javascript自然分类法算法实现代码
2013/10/11 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
JS仿JQuery选择器功能
2017/03/08 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
python 日期操作类代码
2018/05/05 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
windows10下安装TensorFlow Object Detection API的步骤
2019/06/13 Python
python 实现图片裁剪小工具
2021/02/02 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
幼儿园教师备课制度
2014/01/12 职场文书
设备动力科岗位职责范本
2014/02/23 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
大型公益活动策划方案
2014/08/20 职场文书
春秋淹城导游词
2015/02/11 职场文书
高中运动会前导词
2015/07/20 职场文书
python编写五子棋游戏
2021/05/25 Python