链表的基础与实现:Python 进阶数据结构解析
🚀 「1. 单向链表:从零开始实现」
「单向链表」是一种基础的链表结构,每个节点包含数据和指向下一个节点的指针。与数组相比,链表在插入和删除时更高效。
「单向链表结构」
- 每个节点包含数据和指向下一个节点的引用
- 头节点(Head)用于标记链表的起点
- 末尾节点的引用为空(None)
「代码实现」
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def append(self, data):
new_node = Node(data)
if not self.head:
self.head = new_node
return
last_node = self.head
while last_node.next:
last_node = last_node.next
last_node.next = new_node
def print_list(self):
current = self.head
while current:
print(current.data, end=" -> ")
current = current.next
print("None")
「实例演示」
ll = LinkedList()
ll.append(1)
ll.append(2)
ll.append(3)
ll.print_list() # 输出: 1 -> 2 -> 3 -> None
🔄 「2. 双向链表:如何构建与操作」
「双向链表」在单向链表的基础上,增加了一个 prev 指针,指向前一个节点,使得可以从两端进行遍历。
「双向链表结构」
- 每个节点包含
data、next和prev指针 - 适用于需要频繁在两端操作的场景
「代码实现」
class DNode:
def __init__(self, data):
self.data = data
self.next = None
self.prev = None
class DoublyLinkedList:
def __init__(self):
self.head = None
def append(self, data):
new_node = DNode(data)
if not self.head:
self.head = new_node
return
last_node = self.head
while last_node.next:
last_node = last_node.next
last_node.next = new_node
new_node.prev = last_node
def print_list(self):
current = self.head
while current:
print(current.data, end=" <-> ")
current = current.next
print("None")
「实例演示」
dll = DoublyLinkedList()
dll.append(1)
dll.append(2)
dll.append(3)
dll.print_list() # 输出: 1 <-> 2 <-> 3 <-> None
🔃 「3. 链表反转:如何高效地反转一个链表」
链表反转是一种常见操作,其目的是将链表中的节点顺序倒置。反转操作仅需一次遍历,时间复杂度为 「O(n)」。
「代码实现」
def reverse_linked_list(head):
prev = None
current = head
while current:
next_node = current.next
current.next = prev
prev = current
current = next_node
return prev # 返回新的头节点
「实例演示」
ll = LinkedList()
ll.append(1)
ll.append(2)
ll.append(3)
ll.head = reverse_linked_list(ll.head)
ll.print_list() # 输出: 3 -> 2 -> 1 -> None
🔍 「4. 链表 vs 数组:为何链表在插入和删除方面更高效?」
| 操作 | 链表 | 数组 |
|---|---|---|
| 「插入」 | O(1)(调整指针) | O(n)(移动元素) |
| 「删除」 | O(1)(调整指针) | O(n)(移动元素) |
| 「随机访问」 | O(n)(需遍历) | O(1) |
「链表优势」
- 「动态内存分配」:不需要预留固定大小的内存
- 「高效插入与删除」:只需调整指针,而无需移动数据
📌 「总结」
链表是 Python 中非常灵活且高效的数据结构,尤其在需要频繁插入和删除操作的场景下,表现优于数组。通过掌握单向链表、双向链表以及链表反转等操作,可以大大提升你对数据结构的理解,为编写高效代码打下坚实基础。
如果你喜欢这篇文章,欢迎 「点赞 + 收藏」,持续关注更多 Python 数据结构与算法的精彩分享! 😊