Python单向链表实现详解:从基础概念到核心方法

顾言
顾言
发布时间:2026-10-13| 1人浏览过
原创

本文详细解析Python中单向链表的实现原理与核心方法。内容涵盖链表与数组的区别、节点定义,并逐步演示初始化、长度获取、追加、获取、设置、插入、删除及反转链表的具体代码逻辑,帮助开发者深入理解动态数据结构的运作机制。

本文主要探讨在Python环境下如何实现单向链表,具体细节如下所述。

什么是链表

正如名称所示,链表的核心特征在于“链”式连接。

链表属于一种动态数据结构,其特点在于使用一组任意的存储单元来存放数据元素。链表中的每个元素被称为“结点”,每个结点由数据域和指针域两部分组成。与数组不同,链表无需预先定义大小,且在硬件支持的情况下,理论上可以无限扩展。

链表与数组的不同点:

数组在创建时需要预先定义大小,难以适应数据的动态增减:若数据量小于预定义长度,会造成内存浪费;若超过预定义长度,则无法直接插入。而链表支持动态增删数据,可以灵活地增加节点。

数组适用于通过索引直接获取元素的操作(直接get索引即可),而链表获取元素较为繁琐,需要从头节点开始逐个查找。不过,链表在增删操作上更具优势,只需修改节点的指向即可;相比之下,数组的增删较为麻烦,例如在列表[1,2,3,4]的下标为1的位置插入-2,需要将后续元素[2,3,4]整体后移,并赋值ls[1]=-2。

数组空间通常从栈中分配,对程序员而言方便且快速,但自由度较小。链表空间则从堆中分配,虽然自由度大,但申请和管理过程相对复杂。

链表基本方法实现(Python)

1. 初始化链表

"""节点类"""


class Node(object):
  def __init__(self, data):
    self.data = data
    self.nex = None

def __init__(self):
  """初始化链表"""
  self.head = None

2. 获取链表长度

def __len__(self):
  pre = self.head
  length = 0
  while pre:
    length += 1
    pre = pre.nex
  return length

3. 追加节点

追加节点的操作相对简单:如果head节点不存在,则将当前节点设为head节点;否则,找到尾节点,将尾节点的next指向当前节点(若添加head和tail两个辅助节点,则无需递归寻找尾节点)。

"""追加节点"""

def append(self, data):
  """
  1.head 为none :head-->node
  2.tail.nex-->node
  :param data:
  :return:
  """
  node = Node(data)
  if self.head is None:
    self.head = node
  else:
    pre = self.head
    while pre.nex:
      pre = pre.nex
    pre.nex = node

4. 获取节点

获取节点的操作也较为容易,主要在于判断index值的正负。

def get(self, index):
  """
  :param index:
  :return:
  """
  index = index if index >= 0 else len(self) + index
  if len(self) < index or index < 0:
    return None
  pre = self.head
  while index:
    pre = pre.nex
    index -= 1
  return pre

5. 设置节点

只需找到当前节点并赋值即可。

"""设置节点"""

def set(self, index, data):
  node = self.get(index)
  if node:
    node.data = data
  return node

6. 插入节点

插入节点时,需要找到插入位置的前一个节点pre_node(索引index的正负会影响前一节点的确定,需进行判断),然后将pre_node.nex指向当前节点,同时将当前节点的nex指向pre_node.nex.nex。

"""插入节点"""

def insert(self, index, data):
  """
  1.index 插入节点位置包括正负数
  2.找到index-1-->pre_node的节点
  3.pre_node.next-->node
   node.next-->pre_node.next.next
  4.head
  :param index:
  :param data:
  :return:
  """
  node = Node(data)
  if abs(index + 1) > len(self):
    return False
  index = index if index >= 0 else len(self) + index + 1
  if index == 0:
    node.nex = self.head
    self.head = node
  else:
    pre = self.get(index - 1)
    if pre:
      nex = pre.nex
      pre.nex = node
      node.nex = nex
    else:
      return False
  return node

7. 删除节点

删除节点同样需要区分索引的正负。找到当前节点的前一个节点pre_node和后一个节点next_node,将pre_node.nex指向next_node即可。

"""删除某个元素"""

def delete(self, index):
  f = index if index > 0 else abs(index + 1)
  if len(self) <= f:
    return False
  pre = self.head
  index = index if index >= 0 else len(self) + index
  prep = None
  while index:
    prep = pre
    pre = pre.nex
    index -= 1
  if not prep:
    self.head = pre.nex
  else:
    prep.nex = pre.nex
  return pre.data

8. 反转链表

反转链表的实现方式有多种,较为简单的方法是生成一个新的链表——可以使用数组存储所有节点,然后倒序生成新链表。在此采用另一种方式生成:反转链表即将node.nex指向pre_node,通过递归实现,最后将tail赋值为head。

"""反转链表"""

def __reversed__(self):
  """
  1.pre-->next 转变为 next-->pre
  2.pre 若是head 则把 pre.nex --> None
  3.tail-->self.head
  :return:
  """

  def reverse(pre_node, node):
    if pre_node is self.head:
      pre_node.nex = None
    if node:
      next_node = node.nex
      node.nex = pre_node
      return reverse(node, next_node)
    else:
      self.head = pre_node

  return reverse(self.head, self.head.nex)

9. 清空链表

只需将头节点赋为空即可。

"""清空链表"""

def clear(self):
  self.head = None

总结

以上就是本文关于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 算法库。