Python单向链表和双向链表原理与用法实例详解

Python单向链表和双向链表原理与用法实例详解

简介

链表是数据结构中的一种基本数据结构,由一系列节点(元素)组成,每个节点包含数据域和指针,指针指向下一个节点或前后节点。链表可以分为单向链表和双向链表。单向链表只保存对下一个节点的引用,而双向链表除了保存对下一个节点的引用外,还保存对前一个节点的引用。

单向链表

单向链表是最简单的链表类型,每个节点包含数据和指向下一个节点的指针,最后一个节点的指针指向NULL。

创建单向链表

创建单向链表需要定义一个Node类,该类包含一个数据域和指向下一个节点的指针。

class Node:
   def __init__(self, data=None):
      self.data = data
      self.next = None

然后可以定义一个LinkedList类,该类包含一个头节点。

class LinkedList:
   def __init__(self):
      self.head = None

可以定义添加、删除节点以及遍历链表的方法。

class LinkedList:
   # ...

   def add_node(self, data):
      new_node = Node(data)
      if self.head is None:
         self.head = new_node
         return

      last = self.head
      while last.next:
         last = last.next

      last.next = new_node


   def remove_node(self, key):
      cur_node = self.head
      if cur_node and cur_node.data == key:
          self.head = cur_node.next
          cur_node = None
          return

      prev = None
      while cur_node and cur_node.data != key:
          prev = cur_node
          cur_node = cur_node.next

      if cur_node is None:
          return

      prev.next = cur_node.next
      cur_node = None


   def print_list(self):
      cur_node = self.head
      while cur_node:
          print(cur_node.data)
          cur_node = cur_node.next

示例1:创建单向链表并添加、删除节点

# Create List
linkedList = LinkedList()
linkedList.add_node(1)
linkedList.add_node(2)
linkedList.add_node(3)
linkedList.add_node(4)

# Print List
print("Original List:")
linkedList.print_list()

# Remove Node
linkedList.remove_node(2)

# Print List
print("Updated List:")
linkedList.print_list()

输出:

Original List:
1
2
3
4
Updated List:
1
3
4

双向链表

双向链表除了保存对下一个节点的引用外,还保存对前一个节点的引用。每个节点包含数据、指向下一个节点的指针以及指向前一个节点的指针,第一个节点的指向前一个节点的指针指向NULL,最后一个节点的指向下一个节点的指针指向NULL。

创建双向链表

创建双向链表需要定义一个Node类,该类包含一个数据域、指向前一个节点的指针以及指向下一个节点的指针。

class Node:
   def __init__(self, data=None, prev=None, next=None):
      self.data = data
      self.prev = prev
      self.next = next

然后可以定义一个DoublyLinkedList类,该类包含一个头节点和一个尾节点。

class DoublyLinkedList:
   def __init__(self):
      self.head = None
      self.tail = None

可以定义添加、删除节点以及遍历链表的方法。

class DoublyLinkedList:
   # ...

   def add_node(self, data):
      new_node = Node(data)
      if self.head is None:
         self.head = new_node
         self.tail = new_node
         return

      new_node.prev = self.tail
      self.tail.next = new_node
      self.tail = new_node


   def remove_node(self, key):
      cur_node = self.head
      if cur_node and cur_node.data == key:
         if cur_node.next is None:
            cur_node = None
            self.head = None
            self.tail = None
            return

         next_node = cur_node.next
         next_node.prev = None
         cur_node.next = None
         cur_node = None
         self.head = next_node
         return

      while cur_node and cur_node.data != key:
         cur_node = cur_node.next

      if cur_node is None:
         return

      if cur_node.next is None:
         cur_node.prev.next = None
         self.tail = cur_node.prev
         return

      next_node = cur_node.next
      prev_node = cur_node.prev
      prev_node.next = next_node
      next_node.prev = prev_node
      cur_node.next = None
      cur_node.prev = None
      cur_node = None


   def print_list(self):
      cur_node = self.head
      while cur_node:
          print(cur_node.data)
          cur_node = cur_node.next

示例2:创建双向链表并添加、删除节点

# Create List
doublyLinkedList = DoublyLinkedList()
doublyLinkedList.add_node(1)
doublyLinkedList.add_node(2)
doublyLinkedList.add_node(3)
doublyLinkedList.add_node(4)

# Print List
print("Original List:")
doublyLinkedList.print_list()

# Remove Node
doublyLinkedList.remove_node(2)

# Print List
print("Updated List:")
doublyLinkedList.print_list()

输出:

Original List:
1
2
3
4
Updated List:
1
3
4

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python单向链表和双向链表原理与用法实例详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • js + css实现标签内容切换功能(实例讲解)

    JS + CSS实现标签内容切换功能的完整攻略 1. HTML结构准备 首先,我们需要准备一个HTML结构,其中包含标签导航和内容区域。示例如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>标签内容切换…

    other 2023年6月28日
    00
  • curl是否不能识别为内部或外部命令?

    以下是关于“curl是否不能识别为内部或外部命令?”的完整攻略,包含两个示例。 curl是否不能识别为内部或外部命令? 在使用curl命令,有时会出现“不是内部或外部命令”的错误提示。这通常是因为系统没有将curl添加到环境变量。以下是关于如何解决这个问题的详细攻略。 1. 添加curl到环境变量 在Windows系统中,我们可以curl添加到环境变量中,以…

    other 2023年5月9日
    00
  • @Transactional注解:多个事务嵌套时,独立事务处理方式

    @Transactional注解: 多个事务嵌套时,独立事务处理方式 在讲解@Transactional注解的多个事务嵌套时的独立事务处理方式之前,我们先来了解一下@Transactional注解的作用。@Transactional注解是Spring框架中用于声明事务的注解,它可以应用在方法或类级别上。当应用在方法上时,该方法将被包装在一个事务中,当应用在类…

    other 2023年7月28日
    00
  • docker-什么是.dockerfile扩展名?

    Docker是一种流行的容器化平台,可以帮助开发人员和运维人员更轻松地构建、部署和管理应用程序。在Docker中,可以使用Dockerfile来定义容器镜像的构建过程。Dockerfile是一个文本文件,其中包含一系列指令,用于指定如何构建容器镜像。Dockerfile文件通常使用.dockerfile扩展名。 以下是使用Dockerfile的完整攻略: 步…

    other 2023年5月9日
    00
  • 脚本设置ipbat命令行设置自动获取ip和固定ip

    以下是详细讲解“脚本设置ipbat命令行设置自动获取ip和固定ip的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本: 脚本设置IP – BAT命令行设置自动获取IP和固定IP 在Windows操作系统中,我们使用BAT命令行脚本来设置自动获取IP和固定IP。本攻略将介绍如何使用BAT命令行脚本来设置IP,包括自动获取IP和固定IP两种方…

    other 2023年5月10日
    00
  • 编码自动识别工具uchardet

    以下是关于“编码自动识别工具uchardet”的完整攻略: uchardet简介 uchardet是一个开源的编码自动识别工具,可以自动识别文本文件编码格式。它支持多种编码格式,包括UTF-8、GBK、GB2312、ISO-8859等。 安装uchardet 在Linux系统中可以使用以下命令安装uchardet: sudo apt-get install …

    other 2023年5月9日
    00
  • 计算机操作系统详解

    计算机操作系统详解攻略 简介 计算机操作系统(Operating System, OS)是计算机系统中非常重要的一个组成部分,在计算机系统中充当着管理和控制计算机硬件与软件资源的角色,是用户和计算机硬件之间的桥梁。本文将详细讲解计算机操作系统的基本概念、功能、分类、特征等内容,以及介绍如何学习和使用计算机操作系统。 基本概念 计算机操作系统是一种软件,它主要…

    其他 2023年4月16日
    00
  • VS报错提示两个文件为同一个输出路径怎么办?

    当我们在使用 Visual Studio(简称VS)编译、打包代码时,有时会遇到“VS报错提示两个文件为同一个输出路径”的错误提示。这个错误是由于在源代码项目中,存在两个或多个文件,它们的输出路径相同而导致的。出现这个错误会影响编译、打包代码的进度,因此需要我们解决这个问题。针对这个问题,我们可以按照以下步骤进行解决。 步骤一:检查项目中的文件是否重复 在V…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部