热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

双向链表的定义与基本操作

双向链表是一种在每个节点中包含两个指针的数据结构,分别指向其前驱和后继节点。这种特性使得双向链表在某些操作上比单向链表更为灵活和高效。本文将详细介绍双向链表的基本概念及其常见的操作。

双向链表简介


双向链表(Doubly Linked List)是一种线性数据结构,其中每个节点不仅包含指向下一个节点的链接,还包含指向前一个节点的链接。这种双面性使得双向链表在插入、删除等操作上具有更高的灵活性和效率。



节点定义


每个节点包含三个部分:数据域、前驱指针和后继指针。以下是Python中节点类的实现:



class Node:
def __init__(self, data=None):
self.data = data # 节点存储的数据
self.prev = None # 指向前驱节点
self.next = None # 指向后继节点


双向链表类定义


为了管理这些节点,我们定义了一个双向链表类,该类提供了多种常用操作,如添加、删除、查找等。



class DoublyLinkedList:
def __init__(self):
self.head = None # 初始化头节点为空

def is_empty(self):
return self.head is None # 判断链表是否为空

def length(self):
count = 0
current = self.head
while current is not None:
count += 1
current = current.next
return count # 返回链表长度

def add(self, data):
new_node = Node(data)
if self.is_empty():
self.head = new_node
else:
new_node.next = self.head
self.head.prev = new_node
self.head = new_node # 将新节点添加到头部

def append(self, data):
new_node = Node(data)
if self.is_empty():
self.head = new_node
else:
current = self.head
while current.next is not None:
current = current.next
current.next = new_node
new_node.prev = current # 将新节点添加到尾部

def insert(self, index, data):
if index <= 0:
self.add(data)
elif index >= self.length():
self.append(data)
else:
new_node = Node(data)
current = self.head
position = 0
while position current = current.next
position += 1
new_node.prev = current
new_node.next = current.next
current.next.prev = new_node
current.next = new_node # 在指定位置插入节点

def remove(self, data):
current = self.head
while current is not None:
if current.data == data:
if current == self.head:
self.head = current.next
if current.next is not None:
current.next.prev = None
else:
current.prev.next = current.next
if current.next is not None:
current.next.prev = current.prev
return True
current = current.next
return False # 删除指定值的节点

def search(self, data):
current = self.head
while current is not None:
if current.data == data:
return True
current = current.next
return False # 查找指定值是否存在

def traverse(self):
current = self.head
while current is not None:
print(current.data, end='\t')
current = current.next
print() # 遍历并打印链表中的所有元素


示例代码执行结果


通过以下代码可以创建一个双向链表,并演示其各种操作的结果:



if __name__ == '__main__':
dll = DoublyLinkedList()
dll.add(11)
dll.add(22)
print('初始链表:')
dll.traverse()
print('追加元素:')
dll.append(100)
dll.append(200)
dll.traverse()
print('指定位置插入:')
dll.insert(-1, 44)
dll.insert(2, 33)
dll.traverse()
print('删除节点:')
dll.remove(44)
dll.remove(200)
dll.remove(33)
dll.traverse()
print('链表长度:', dll.length())
print('查找节点22:', dll.search(22))


推荐阅读
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 本文探讨了在地理信息系统中,如何通过图层数据获取任意两条道路的交叉点坐标及其名称。文中详细介绍了实现方法和相关技术细节。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
author-avatar
Fxnananana
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有