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中lambda函数 list comprehension 和 zip函数使用指南
Sep 28 Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 Python
Python安装图文教程 Pycharm安装教程
Mar 27 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
Python pandas.DataFrame 找出有空值的行
Sep 09 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
Apr 30 Python
python爬取微博评论的实例讲解
Jan 15 Python
Python实现信息管理系统
Jun 05 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
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
php中fsockopen用法实例
2015/01/05 PHP
php提取微信账单的有效信息
2018/10/01 PHP
javascript开发中因空格引发的错误
2010/11/08 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
纯js的右下角弹窗实例
2017/03/12 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
JavaScript中ES6规范中let和const的用法和区别
2020/08/06 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
python 实现归并排序算法
2012/06/05 Python
理解python多线程(python多线程简明教程)
2014/06/09 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
python实现随机加减法生成器
2020/02/24 Python
Python如何实现爬取B站视频
2020/05/20 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
护理专业的自荐信
2013/10/22 职场文书
董事长职责范文
2013/11/08 职场文书
人事助理自荐信
2014/02/02 职场文书
12月红领巾广播稿
2014/02/13 职场文书
考勤制度通知
2015/04/25 职场文书
python脚本框架webpy模板控制结构
2021/11/20 Python
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers