链表的基础与实现:Python 进阶数据结构解析

150 阅读2分钟

链表的基础与实现: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 指针,指向前一个节点,使得可以从两端进行遍历。

「双向链表结构」

  • 每个节点包含 datanextprev 指针
  • 适用于需要频繁在两端操作的场景

「代码实现」

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 数据结构与算法的精彩分享! 😊