博客
关于我
python数据结构(四):带头结点的双链表
阅读量:709 次
发布时间:2019-03-21

本文共 4778 字,大约阅读时间需要 15 分钟。

带头结点的双链表的实现与带头结点的单链表的实现有相当高的相似性,最大的区别就是前者会多一个前驱结点指针域的操作。以下是对双链表实现的详细说明。

双链表的定义

双链表由两个方向的链表组成,每个结点不仅包含下一个结点的指针,还包含前一个结点的指针。通过这种方式,双链表支持的操作包括插入、删除、查找以及逆序遍历等。

双链表的实现

双链表的实现主要包含以下几个部分:

  • 结点类

    结点类 DoubleLinkedNode 定义了双链表的基本单元:

    class DoubleLinkedNode(object):    def __init__(self, data):        self.data = data        self.next = None        self.prev = None
  • 双链表类

    双链表类 DoubleLinkedList 负责管理整个双链表的逻辑:

    class DoubleLinkedList(object):    def __init__(self):        self.head = DoubleLinkedNode("头结点")
  • 双链表的操作方法

    双链表支持的主要操作包括:

    • 判断链表是否为空:
      def IsEmpty(self):    if self.GetLength() == 0:        print("该链表为空!")        return True    else:        return False
    • 获取链表长度:
      def GetLength(self):    currentNode = self.head.next    length = 0    while currentNode != None:        length += 1        currentNode = currentNode.next    return length
    • 遍历链表:
      def Traval(self):    if self.IsEmpty():        return    currentNode = self.head    print("当前链表为:")    while currentNode != None:        print(currentNode.data, end="<-> ")        currentNode = currentNode.next    print("")
    • 尾部插入元素:
      def InsertElementInTail(self):    element = input("待从尾部插入的结点的数据:")    if element == "#":        return    currentNode = self.head    newNode = DoubleLinkedNode(element)    while currentNode.next != None:        currentNode = currentNode.next    currentNode.next = newNode    newNode.prev = currentNode    self.Traval()
    • 头部插入元素:
      def InsertElementInHead(self):    element = input("待从头部插入的结点的数据:")    if element == "#":        return    newNode = DoubleLinkedNode(element)    newNode.next = self.head.next    self.head.next = newNode    newNode.prev = self.head    self.Traval()
    • 指定位置插入元素:
      def InsertElementInSpecifiedPosition(self):    Pos = 0    currentNode = self.head    element, position = input("结点的数据 待插入的结点在双链表中的位置").split(" ")    position = int(position)    if position < 1 or position > self.GetLength() + 1:        print("位置不合法!请重新确定位置!")        return    newNode = DoubleLinkedNode(element)    while currentNode.next != None:        Pos += 1        if Pos == position:            newNode.next = currentNode.next            currentNode.next = newNode            newNode.prev = currentNode            self.Traval()            return        else:            currentNode = currentNode.next
    • 查找指定数据的所有结点:
      def FindElement(self):    Position = []    Pos = 0    currentNode = self.head    element = input("待查找的数据:")    if self.IsEmpty():        print("当前双链表为空!无法查找!")        return    while currentNode.next != None:        currentNode = currentNode.next        Pos += 1        if currentNode.data == element:            Position.append(Pos)    if Position:        print("查找成功,值为", element, "的结点位于该双链表的第", Position, "位。")    else:        print("查找失败!当前双链表中不存在含有", element, "的结点")
    • 删除指定位置的结点:
      def DeleteElementInSpecifiedPosition(self):    print("在指定位置删除结点")    Pos = 0    currentNode = self.head    position = int(input("待删除的位置:"))    if self.IsEmpty():        print("当前双链表为空!无法删除结点!")        return    if position < 1 or position > self.GetLength():        print("位置不合法!请重新确定位置!")        return    while currentNode.next != None:        removedNode = currentNode.next        Pos += 1        if Pos == position:            currentNode.next = removedNode.next            if removedNode.next == None:                del removedNode            else:                removedNode.next.prev = currentNode                del removedNode        else:            currentNode = currentNode.next    self.Traval()
    • 删除所有指定数据的结点:
      def DeleteElement(self):    if self.IsEmpty():        print("当前双链表为空!")        return    element = input('请输入待删除结点的值:')    currentNode = self.head    while currentNode.next != None:        removedNode = currentNode.next        if removedNode.data == element:            currentNode.next = removedNode.next            if currentNode.next == None:                del removedNode            else:                removedNode.next.prev = currentNode                del removedNode        else:            currentNode = currentNode.next    print("成功删除所有含值为", element, "的结点")    self.Traval()
    • 销毁链表:
      def Destory(self):    print("正在销毁该链表...")    del self.head    print("已销毁该双链表!")
  • 示例操作

    以下是双链表的实际操作示例:

  • 创建双链表并添加元素

    dl = DoubleLinkedList()dl.Create()  # 调用创建方法
    • 输入元素时按下 Enter 以继续,或输入 # 以关闭。
    • 创建后的双链表初始结构为:头结点->1->2->3->4->
  • 尾部插入元素

    dl.InsertElementInTail()
    • 输入 4 将从尾部插入,链表变为:头结点->0->1->2->3->4->4
  • 头部插入元素

    dl.InsertElementInHead()
    • 输入 0 将从头部插入,链表变为:头结点->0->0->1->2->3->4->4
  • 指定位置插入元素

    dl.InsertElementInSpecifiedPosition()
    • 输入 100 和位置 1 将从头部插入,链表变为:头结点->100->0->0->1->2->3->4->4
  • 查找特定数据的所有结点

    dl.FindElement()
    • 输入 4 查找结果显示存在两个结点,分别位于第 6 位和 7 位。
  • 删除指定位置的结点

    dl.DeleteElementInSpecifiedPosition()
    • 删除位置 1 的结点 0,链表变为:头结点->0->1->2->3->4->4
  • 删除所有特定数据的结点

    dl.DeleteElement()
    • 输入 4 删除所有数据为 4 的结点,链表变为空:头结点->。
  • 如需进一步了解双链表的实现和操作方法,可以在 技术文献 中查找更多相关资料。

    转载地址:http://jnzrz.baihongyu.com/

    你可能感兴趣的文章
    python在gpu上运行_【python】python开启GPU加速
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    Python和RF编写web自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
    查看>>
    python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
    查看>>
    Python命名中尾随下划线有什么好处?
    查看>>