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中用memcached来减少数据库查询次数的教程
Apr 07 Python
Python中利用原始套接字进行网络编程的示例
May 04 Python
Python实现GUI学生信息管理系统
Apr 05 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
Aug 20 Python
Python笔试面试题小结
Sep 07 Python
kafka监控获取指定topic的消息总量示例
Dec 23 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
python 一维二维插值实例
Apr 22 Python
Python实现将元组中的元素作为参数传入函数的操作
Jun 05 Python
python os.rename实例用法详解
Dec 06 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线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
5 cool javascript apps
2007/03/24 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
如何搜索查找并解决Django相关的问题
2014/06/30 Python
python获取元素在数组中索引号的方法
2015/07/15 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
Python基本语法经典教程
2016/03/11 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
python实现求两个字符串的最长公共子串方法
2018/07/20 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
数据库测试通常都包括哪些方面
2015/11/30 面试题
城市规划毕业生求职信
2013/10/10 职场文书
管理失职检讨书
2014/02/12 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
社区党务工作总结2015
2015/05/19 职场文书
安全教育的主题班会
2015/08/13 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS