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

yizhihongxing

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日

相关文章

  • fetchtype.lazy优缺点

    fetchtype.lazy优缺点 什么是fetchtype.lazy 在JPA的@OneToMany和@ManyToMany注解中,有一个属性叫做fetch,用于指定数据的加载方式。其中,fetchtype.lazy表示懒加载方式,以延迟加载数据为代价,从而提高程序的性能。 优点 节省时间和资源 懒加载可以延迟加载数据,只有在需要时才会去加载数据,这样可以…

    其他 2023年3月28日
    00
  • vue组件化中slot的基本使用方法

    当在Vue组件化中使用slot时,可以将其视为一种占位符,用于在组件中插入内容。通过使用slot,我们可以在父组件中定义子组件的内容,从而实现更灵活的组件复用。 以下是使用slot的基本步骤: 在父组件中定义子组件的插槽: <template> <div> <h1>父组件</h1> <slot>&l…

    other 2023年8月20日
    00
  • 加载gif动画的三种方式

    加载gif动画的三种方式 在网页设计中,动画是一个非常常用的元素。而其中一种最为常见的动画就是gif格式的动画。如何在网页中加载gif动画呢?本文将介绍三种常用的方式。 1. 直接使用gif图片 最为简单的方式便是直接使用gif图片。只需在html代码中插入如下代码即可: <img src="example.gif" alt=&qu…

    其他 2023年3月29日
    00
  • Java结构型设计模式中建造者模式示例详解

    Java结构型设计模式中建造者模式示例详解 什么是建造者模式? 建造者模式是一种创建型设计模式,它允许你创建复杂对象的过程与其表示相分离。通过使用相同的构建过程,可以创建不同的表示。 示例1:创建一个电脑对象 假设我们要创建一个电脑对象,它有许多可选的组件,如CPU、内存、硬盘等。使用建造者模式可以将创建过程与表示分离,使得我们可以根据需要选择不同的组件来构…

    other 2023年8月6日
    00
  • guava本地缓存

    以下是关于Guava本地缓存的完整攻略,包含两个示例。 Guava本地缓存 Guava是Google开发的一个Java库,提供了许多实用的工具类和数据结构。其中,Guava本地缓存是一个非常实用的工具,可以帮助我们应用程序中缓存数据,提高应用程序的性能。以下是使用Guava本地缓存的详细攻略。 1. 添加依赖 在使用Guava本地缓存之前,我们需要在项目中添…

    other 2023年5月9日
    00
  • 如何在Linux下设置访问控制列表(ACL)来控制用户的权限

    如何在Linux下设置访问控制列表(ACL)来控制用户的权限 ACL被用来对文件和目录进行权限控制。它允许管理员为某个文件或目录单独设置授权,并限制不同用户或用户组对该文件或目录的权限。 以下是在Linux下设置ACL的步骤: 安装ACL软件包:如果你的系统还没有安装ACL软件包,则需要进行安装。对于Debian/Ubuntu系统,使用以下命令进行安装: s…

    other 2023年6月27日
    00
  • Win10系统开机后黑屏需强制关机再重启才能进入系统的故障原因及解决方法

    故障原因分析 出现Win10系统开机后黑屏需强制关机再重启才能进入系统的故障,一般会有以下几种原因: 1. 硬件问题 可能是硬盘、内存、显卡等硬件出现问题,导致系统无法正常启动显示,造成黑屏现象。 解决方法:建议用硬件检测工具进行检测,排查出故障硬件,进行更换或修复。例如使用Memtest86检测内存或使用硬盘检测工具检测硬盘问题。 2. 病毒感染 可能是系…

    other 2023年6月27日
    00
  • 使用国内docker镜像源

    以下是“使用国内docker镜像源的完整攻略”的标准markdown格式文本,其中包含了两个示例说明: 使用国内Docker镜像源 Docker是一种流行的容器化技术,但是在使用Docker时,由于国际网络的限制,下载Docker镜像可能会很慢。为了解决这个问题,我们可以使用国内的Docker镜像源。本文将介绍如何使用国内Docker镜像源,包括两个示说明。…

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