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日

相关文章

  • package.json管理依赖包版本详解

    package.json管理依赖包版本详解 在Node.js项目中,package.json文件是用来管理项目依赖包的配置文件。通过package.json,我们可以指定项目所需的依赖包及其版本。下面是关于如何管理依赖包版本的详细攻略。 1. 创建package.json文件 首先,我们需要在项目根目录下创建一个package.json文件。可以通过以下命令…

    other 2023年8月3日
    00
  • django filter过滤器实现显示某个类型指定字段不同值方式

    下面是关于“django filter过滤器实现显示某个类型指定字段不同值方式”的完整攻略。 1. 前置条件 在使用django filter进行过滤之前,需要保证你已经: 在django项目中安装好了django filter模块; 在django项目的settings.py文件中配置好了INSTALLED_APPS选项,添加了’django_filter…

    other 2023年6月25日
    00
  • Android中fragment与activity之间的交互(两种实现方式)

    ” + data, Toast.LENGTH_SHORT).show(); } }); }}“` 以上是两种在Android中实现Fragment与Activity之间交互的方式,你可以根据具体的需求选择适合的方式来实现交互。希望对你有所帮助!

    other 2023年9月6日
    00
  • 魔兽世界7.3.5狂徒贼怎么堆属性 wow7.35狂徒贼配装属性优先级攻略

    魔兽世界7.3.5狂徒贼属性堆叠攻略 1. 介绍 狂徒贼在魔兽世界中是一个高爆发的近战职业,通过快速连击和毒药造成大量伤害。在7.3.5版本中,属性堆叠是提高狂徒贼输出的关键之一。本攻略将详细讲解如何堆叠属性以及属性的优先级。 2. 属性优先级 属性的优先级决定了在配装过程中应该优先考虑哪些属性。下面是狂徒贼属性的优先级从高到低的排序: 爆击:提高你的技能触…

    other 2023年6月28日
    00
  • Java多线程揭秘之synchronized工作原理

    Java多线程揭秘之synchronized工作原理 Java多线程编程中,synchronized关键字是最基础和最常用的并发控制手段之一,也是Java内置的重量级锁实现。本文将详细讲解synchronized关键字的工作原理,以及如何正确使用synchronized。 synchronized基本概念 synchronized是Java中的一个关键字,它…

    other 2023年6月27日
    00
  • C语言位运算符的具体使用

    C语言位运算符是对二进制数据进行位运算的操作符,可以实现对数据的位操作和翻转。 以下是C语言中常用的位运算符: · “&” 按位与:两个相应的二进制位都为1,则该位的结果为1,否则为0。 · “|” 按位或:两个相应的二进制位中只要有一个为1,则该位的结果为1,否则为0。 · “^” 按位异或:两个相应的二进制位中若不同,则该位的结果为1,否则为0。…

    other 2023年6月27日
    00
  • 免费临时短信临时邮箱接收验证码

    很多时候,在进行一些注册登录等操作时,需要输入验证码。但有时候我们并不想使用己的手机号或邮箱接收验证码,这时候可以使用免费的临时短和临时邮箱来接收验证码。 这里推荐两个常用的临时短信和临时邮箱网站: 临时短信 临时邮箱 使用这些网站可以免费获取临时的手机号和邮箱,用于接收验证码。因特殊原因,您访问此网站可能需借助科学上网工具,推荐阅读:《推荐几个靠谱的VPN…

    2023年5月7日
    00
  • 桌面右键快捷方式无效 压haozip快捷方式打不开的解决方法

    桌面右键快捷方式无效 压haozip快捷方式打不开的解决方法 如果你在使用Windows操作系统时遇到了桌面右键快捷方式无效或者压haozip快捷方式打不开的情况,可能会让你感到很困惑。本文将会为你提供解决这类问题的有效方法。 方法一:重置Windows资源管理器 当Windows资源管理器出现错误时,可能会导致桌面右键快捷方式无效或者压haozip快捷方式…

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