Python单链表数据结构详解与完整代码实现

Mason
Mason
发布时间:2026-10-12| 2人浏览过
原创

本文详细介绍单链表的底层存储原理,并提供一套在Python 3环境下可直接运行的完整实现代码。涵盖节点定义、列表初始化、插入、删除、查询、更新及清空等核心操作,附带测试用例与运行结果,帮助开发者快速掌握链式结构的编程实践。

单链表的核心概念

链表(Linked List)是一种线性数据结构,由一系列被称为结点(Node)的元素组成。每个结点包含两部分:数据域用于存储实际元素值,指针域用于记录下一个结点的内存地址。与数组不同,链表不需要连续的内存空间,第一个结点称为头结点,最后一个结点的指针域通常指向 None。这种结构使得动态插入和删除操作具有较低的固定成本。

Python 单链表完整实现代码

以下是基于面向对象思想的标准实现。代码已针对现代 Python 3 语法进行修正,补全了原稿中缺失的参数处理与边界检查逻辑,确保所有方法均可稳定调用。

# 定义链表中的单个节点
class Node(object):
    def __init__(self, val, next_node=None):
        self.data = val
        self.next = next_node

# 定义单链表类
class LinkList(object):
    def __init__(self):
        self.head = None

    def is_empty(self):
        """判断链表是否为空"""
        return self.head is None

    def get_length(self):
        """获取链表长度"""
        length = 0
        curr = self.head
        while curr is not None:
            length += 1
            curr = curr.next
        return length

    def init_list(self, data):
        """根据列表数据初始化链表"""
        if not data:
            return
        self.head = Node(data[0])
        p = self.head
        for item in data[1:]:
            node = Node(item)
            p.next = node
            p = p.next

    def append(self, item):
        """在链表尾部追加元素"""
        new_node = Node(item)
        if self.is_empty():
            self.head = new_node
        else:
            curr = self.head
            while curr.next is not None:
                curr = curr.next
            curr.next = new_node

    def get_item(self, index):
        """根据索引获取节点数据(支持正向索引)"""
        if self.is_empty() or index < 0 or index >= self.get_length():
            print('Index out of bounds or list is empty.')
            return None
        curr = self.head
        for i in range(index):
            curr = curr.next
        return curr.data

    def set_item(self, index, value):
        """根据索引修改节点数据"""
        if self.is_empty() or index < 0 or index >= self.get_length():
            print('Index out of bounds.')
            return
        curr = self.head
        for i in range(index):
            curr = curr.next
        curr.data = value

    def insert(self, index, item):
        """在指定位置插入新节点"""
        if index < 0 or index > self.get_length():
            print('Invalid index for insertion.')
            return
        new_node = Node(item)
        if index == 0:
            new_node.next = self.head
            self.head = new_node
        else:
            curr = self.head
            for i in range(index - 1):
                curr = curr.next
            new_node.next = curr.next
            curr.next = new_node

    def delete(self, index):
        """删除指定位置的节点"""
        if self.is_empty() or index < 0 or index >= self.get_length():
            print('Invalid index for deletion.')
            return
        if index == 0:
            self.head = self.head.next
        else:
            curr = self.head
            for i in range(index - 1):
                curr = curr.next
            curr.next = curr.next.next

    def index_of(self, value):
        """查找值首次出现的索引,未找到返回 -1"""
        curr = self.head
        index = 0
        while curr is not None:
            if curr.data == value:
                return index
            curr = curr.next
            index += 1
        return -1

    def clear(self):
        """清空链表"""
        self.head = None

# ================= 测试代码 =================
if __name__ == "__main__":
    link_list = LinkList()
    link_list.init_list([1, 2, 3, 4, 5])
    print("初始第4个元素:", link_list.get_item(4))
    link_list.append(6)
    print("追加后第5个元素:", link_list.get_item(5))

    link_list.insert(4, 40)
    print("在索引4插入40后,第3/4/5个元素:", link_list.get_item(3), link_list.get_item(4), link_list.get_item(5))
    
    link_list.delete(5)
    print("删除第5个元素后,第5个元素:", link_list.get_item(5))
    print("查找元素5的索引:", link_list.index_of(5))
    

核心功能说明

  • init_list / append:负责数据的批量导入与尾部动态扩容,避免手动逐个拼接。
  • get_item / set_item:通过遍历指针定位目标索引,实现只读访问与原地修改,符合常规序列操作习惯。
  • insert / delete:核心难点在于维护前驱节点的 .next 引用。插入时先断链再连入,删除时直接跳过目标节点释放引用,时间复杂度均为 O(n)。
  • index_of / clear:提供值匹配搜索与彻底回收内存的快速接口。

常见运行排错与注意事项

  1. 语法版本兼容:原稿使用了 Python 2 的 print '...' 语句与硬编码 0 代替空指针。现代开发务必升级至 Python 3,将 print 改为函数调用,并将空指针统一规范为 None。
  2. 索引越界保护:链表操作中极易触发 IndexError 或 AttributeError。实现时必须在方法入口加入 index < 0 或 index >= length 的判断,避免 curr.next 对 None 调用属性。
  3. 内存泄漏防范:clear() 方法只需将头指针置为 None,Python 垃圾回收机制会自动断开后续链并释放节点内存,无需手动逐一销毁。

总结

单链表是理解复杂树形结构与图算法的基石。上述实现覆盖了工业级数据结构的常用交互模式,开发者可直接将其集成至项目模板中。以上就是Python单链表完整实现的详细内容,更多关于Python数据结构与算法的基础资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。