微信登录

链表 - 单链表 - 单链表的实现与操作

链表 - 单链表 - 单链表的实现与操作

一、引言

在数据的世界里,我们常常需要存储和管理大量的数据。数组作为一种常见的数据存储结构,使用起来非常方便,但它也有一些局限性,比如在插入和删除元素时效率较低,而且数组的大小在创建时就已经确定,难以动态调整。这时,链表这种数据结构就应运而生,它为数据的存储和操作提供了一种更加灵活的方式。而单链表作为链表家族中最基础、最简单的一员,是我们学习链表的敲门砖。

二、单链表的基本概念

(一)定义

单链表是一种线性数据结构,它由一系列节点组成,每个节点包含两个部分:数据域和指针域。数据域用于存储实际的数据,而指针域则存储指向下一个节点的地址(引用)。通过这种方式,节点之间就形成了一个链式的结构,就像一条链子上的各个环一样,一个接着一个。

(二)结构特点

单链表的第一个节点称为头节点,最后一个节点的指针域通常指向空(null),表示链表的结束。由于每个节点只包含一个指向下一个节点的指针,所以只能从链表的头节点开始,沿着指针的方向依次访问各个节点,不能逆向访问。

以下是单链表节点的示意图:
| 数据域 | 指针域 |
| —— | —— |
| 存储数据 | 指向下一个节点的地址 |

三、单链表的实现

(一)节点类的实现

在 Python 中,我们可以通过定义一个节点类来表示单链表的节点。以下是节点类的代码实现:

  1. class Node:
  2. def __init__(self, data):
  3. self.data = data # 数据域
  4. self.next = None # 指针域,初始化为 None

(二)单链表类的实现

接下来,我们可以定义一个单链表类,包含链表的基本操作,如初始化、插入、删除、查找等。

  1. class SinglyLinkedList:
  2. def __init__(self):
  3. self.head = None # 初始化头节点为 None
  4. # 判断链表是否为空
  5. def is_empty(self):
  6. return self.head is None
  7. # 在链表头部插入节点
  8. def prepend(self, data):
  9. new_node = Node(data)
  10. new_node.next = self.head
  11. self.head = new_node
  12. # 在链表尾部插入节点
  13. def append(self, data):
  14. new_node = Node(data)
  15. if self.is_empty():
  16. self.head = new_node
  17. else:
  18. current = self.head
  19. while current.next:
  20. current = current.next
  21. current.next = new_node
  22. # 删除指定值的节点
  23. def delete(self, data):
  24. if self.is_empty():
  25. return
  26. if self.head.data == data:
  27. self.head = self.head.next
  28. return
  29. current = self.head
  30. while current.next and current.next.data!= data:
  31. current = current.next
  32. if current.next:
  33. current.next = current.next.next
  34. # 查找指定值的节点
  35. def search(self, data):
  36. current = self.head
  37. while current:
  38. if current.data == data:
  39. return True
  40. current = current.next
  41. return False
  42. # 遍历链表并打印节点值
  43. def display(self):
  44. elements = []
  45. current = self.head
  46. while current:
  47. elements.append(current.data)
  48. current = current.next
  49. print(" -> ".join(map(str, elements)))

四、单链表的操作示例

(一)创建链表并插入节点

  1. # 创建一个单链表对象
  2. sll = SinglyLinkedList()
  3. # 在链表头部插入节点
  4. sll.prepend(3)
  5. sll.prepend(2)
  6. sll.prepend(1)
  7. # 在链表尾部插入节点
  8. sll.append(4)
  9. sll.append(5)
  10. # 显示链表
  11. sll.display() # 输出: 1 -> 2 -> 3 -> 4 -> 5

(二)删除节点

  1. # 删除值为 3 的节点
  2. sll.delete(3)
  3. # 显示链表
  4. sll.display() # 输出: 1 -> 2 -> 4 -> 5

(三)查找节点

  1. # 查找值为 4 的节点
  2. print(sll.search(4)) # 输出: True
  3. # 查找值为 6 的节点
  4. print(sll.search(6)) # 输出: False

五、单链表的优缺点总结

优点 缺点
1. 动态大小:可以根据需要动态地添加或删除节点,不需要预先分配固定大小的内存空间。<br>2. 插入和删除效率高:在链表中插入或删除节点的时间复杂度为 $O(1)$(在已知节点位置的情况下)。 1. 随机访问效率低:不能像数组那样通过下标直接访问元素,需要从头节点开始依次遍历,时间复杂度为 $O(n)$。<br>2. 额外的指针开销:每个节点都需要额外的指针域来存储指向下一个节点的地址,增加了内存开销。

六、结语

单链表作为一种基础的数据结构,虽然有其自身的优缺点,但在很多场景下都有着广泛的应用,比如实现栈、队列等数据结构,以及在一些需要频繁插入和删除操作的场景中。通过对单链表的学习和实践,我们可以更好地理解数据结构的设计思想和实现方法,为进一步学习更复杂的数据结构和算法打下坚实的基础。希望本文能够帮助你掌握单链表的实现与操作,在编程的道路上更进一步!

链表 - 单链表 - 单链表的实现与操作