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进阶教程之词典、字典、dict
Aug 29 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
Mar 30 Python
深入学习Python中的上下文管理器与else块
Aug 27 Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 Python
Python用 KNN 进行验证码识别的实现方法
Feb 06 Python
Python元组拆包和具名元组解析实例详解
Mar 26 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 Python
浅谈Python批处理文件夹中的txt文件
Mar 11 Python
python MultipartEncoder传输zip文件实例
Apr 07 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
May 15 Python
如何使用 Python 读取文件和照片的创建日期
Sep 05 Python
Python爬虫后获取重定向url的两种方法
Jan 19 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支持页面回退的两种方法[转]
2007/02/14 PHP
Zend的AutoLoad机制介绍
2012/09/27 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
简单实现js浮动框
2016/12/13 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
python中执行shell命令的几个方法小结
2014/09/18 Python
Python随机生成彩票号码的方法
2015/03/05 Python
Python NumPy库安装使用笔记
2015/05/18 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
基于Django用户认证系统详解
2018/02/21 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
Python 支付整合开发包的实现
2019/01/23 Python
python障碍式期权定价公式
2019/07/19 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
Python reques接口测试框架实现代码
2020/07/28 Python
森海塞尔美国官网:Sennheiser耳机与耳麦
2017/07/19 全球购物
车间统计员岗位职责
2014/01/05 职场文书
趣味比赛活动方案
2014/02/15 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
python编程简单几行代码实现视频转换Gif示例
2021/10/05 Python