算法竞赛阶段二-数据结构(38)数据结构动态链表list

动态链表(List)的基本概念

动态链表是一种线性数据结构,通过节点间的指针连接实现动态内存分配。与数组不同,链表的大小可随需增减,插入和删除操作的时间复杂度为 O(1)(已知位置时),但随机访问需要 O(n) 时间。

常见动态链表类型

  1. 单向链表

    每个节点包含数据和指向下一个节点的指针。

    python 复制代码
    class Node:
        def __init__(self, data):
            self.data = data
            self.next = None
  2. 双向链表

    节点包含指向前驱和后继的指针,支持双向遍历。

    python 复制代码
    class Node:
        def __init__(self, data):
            self.data = data
            self.prev = None
            self.next = None
  3. 循环链表

    尾节点指向头节点,形成闭环。

动态链表的操作

插入节点

在头部插入:

python 复制代码
new_node = Node(data)
new_node.next = head
head = new_node

在中间插入(已知前驱节点 prev_node):

python 复制代码
new_node.next = prev_node.next
prev_node.next = new_node

删除节点

删除头节点:

python 复制代码
head = head.next

删除中间节点(已知前驱节点 prev_node):

python 复制代码
prev_node.next = prev_node.next.next

动态链表的优缺点

优点

  • 内存按需分配,避免静态数组的浪费。
  • 插入/删除高效,无需移动其他元素。

缺点

  • 随机访问效率低。
  • 需要额外空间存储指针。

动态链表的应用场景

  • 实现栈、队列等抽象数据类型。
  • 内存管理中的动态分配(如操作系统的空闲内存块管理)。
  • 需要频繁插入/删除的场景(如实时系统)。

示例:单向链表的完整实现

python 复制代码
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 = self.head
        while last.next:
            last = last.next
        last.next = new_node

    def print_list(self):
        current = self.head
        while current:
            print(current.data, end=" -> ")
            current = current.next
        print("None")

注意事项

  • 动态链表需手动管理内存(如 C/C++ 中需释放节点)。
  • 在 Python/Java 等语言中,垃圾回收机制自动处理内存释放。
相关推荐
Jerry34 分钟前
LeetCode 459. 重复的子字符串
算法
海石3 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石3 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry5 小时前
LeetCode 151. 反转字符串中的单词
算法
gugucoding6 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
ChaoZiLL7 小时前
我的数据结构3——链表(link list)
数据结构·链表
a1117768 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜8 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry8 小时前
LeetCode 541. 反转字符串 II
算法
Jerry8 小时前
LeetCode 344. 反转字符串
算法