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 ZipFile模块详解
Nov 01 Python
Python中获取对象信息的方法
Apr 27 Python
Python爬虫爬取美剧网站的实现代码
Sep 03 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
python如何去除字符串中不想要的字符
Jul 05 Python
使用python爬虫获取黄金价格的核心代码
Jun 13 Python
python学生信息管理系统(完整版)
Apr 05 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
Python threading的使用方法解析
Aug 28 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
python3爬取torrent种子链接实例
Jan 16 Python
virtualenv隔离Python环境的问题解析
Jun 21 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利用COM对象访问SQLServer、Access
2006/10/09 PHP
Adodb的十个实例(清晰版)
2006/12/31 PHP
深入php list()函数的详解
2013/06/05 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
在vs2010中调试javascript代码方法
2011/02/11 Javascript
jquery.form.js用法之清空form的方法
2014/03/07 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
使用Python函数进行模块化的实现
2019/11/15 Python
Pytorch to(device)用法
2020/01/08 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
python3中数组逆序输出方法
2020/12/01 Python
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
雅虎笔试题(字符串操作)
2015/03/24 面试题
北京青年观后感
2015/06/15 职场文书
建筑工程催款函
2015/06/24 职场文书
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技