使用Python构建链表

链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据本身及一个指向列表中下一个节点的引用(或指针)。与数组不同,链表中的元素并不是在内存中连续存储的,这使得在链表中添加或删除节点时无需移动其他元素。

本文打算手把手的教你使用Python构建单向链表和双向链表。

单向链表

单向链表是链表的一种,其中每个节点只包含一个指向下一个节点的引用。

步骤 1: 定义节点

首先,需要定义链表的节点。节点需要有两个属性:存储的数据和指向下一个节点的引用。

python 复制代码
class ListNode:
    def __init__(self, value=0, next=None):
        self.value = value
        self.next = next

步骤 2: 构建链表

接下来,定义一个链表类来管理这些节点。链表至少应该包含两个方法:一个用于向链表添加新节点,另一个用于遍历链表打印所有节点的值。

python 复制代码
class SingleLinkedList:
    def __init__(self):
        self.head = None
    
    def append(self, value):
        """在链表末尾添加一个新的节点"""
        if not self.head:
            self.head = ListNode(value)
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = ListNode(value)
    
    def print_list(self):
        """打印链表所有节点的值"""
        current = self.head
        while current:
            print(current.value, end=" ")
            current = current.next
        print()

双向链表

双向链表的每个节点除了有指向下一个节点的引用外,还有一个指向前一个节点的引用。

步骤 1: 定义节点

双向链表的节点需要有三个属性:存储的数据、指向下一个节点的引用和指向前一个节点的引用。

python 复制代码
class DoubleListNode:
    def __init__(self, value=0, prev=None, next=None):
        self.value = value
        self.prev = prev
        self.next = next

步骤 2: 构建链表

定义一个双向链表类来管理节点,提供添加和打印节点的方法。

python 复制代码
class DoubleLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None
    
    def append(self, value):
        """在双向链表末尾添加一个新的节点"""
        if not self.head:
            self.head = self.tail = DoubleListNode(value)
        else:
            self.tail.next = DoubleListNode(value, prev=self.tail)
            self.tail = self.tail.next
    
    def print_list(self):
        """从头到尾打印链表所有节点的值"""
        current = self.head
        while current:
            print(current.value, end=" ")
            current = current.next
        print()

测试

测试单向链表

首先,测试单向链表的添加和打印功能。

python 复制代码
# 单向链表的定义
class ListNode:
    def __init__(self, value=0, next=None):
        self.value = value
        self.next = next

class SingleLinkedList:
    def __init__(self):
        self.head = None
    
    def append(self, value):
        if not self.head:
            self.head = ListNode(value)
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = ListNode(value)
    
    def print_list(self):
        current = self.head
        while current:
            print(current.value, end=" ")
            current = current.next
        print()

# 测试单向链表
print("单向链表测试:")
sll = SingleLinkedList()
sll.append(1)
sll.append(2)
sll.append(3)
sll.print_list()  # 预期输出: 1 2 3

测试双向链表

接着,测试双向链表的添加和打印功能。

python 复制代码
# 双向链表的定义
class DoubleListNode:
    def __init__(self, value=0, prev=None, next=None):
        self.value = value
        self.prev = prev
        self.next = next

class DoubleLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None
    
    def append(self, value):
        if not self.head:
            self.head = self.tail = DoubleListNode(value)
        else:
            self.tail.next = DoubleListNode(value, prev=self.tail)
            self.tail = self.tail.next
    
    def print_list(self):
        current = self.head
        while current:
            print(current.value, end=" ")
            current = current.next
        print()

# 测试双向链表
print("双向链表测试:")
dll = DoubleLinkedList()
dll.append(4)
dll.append(5)
dll.append(6)
dll.print_list()  # 预期输出: 4 5 6

结尾

通过这两个例子,可以看到单向链表和双向链表在添加元素和打印链表时的工作方式。单向链表通过next指针连接各个节点,而双向链表则通过prevnext指针在节点之间建立双向连接,使得从头到尾或从尾到头遍历链表变得更加方便。这两种链表在不同的场景下各有优势,能够有效地解决各种数据管理问题。

相关推荐
梅雅达编程笔记7 小时前
编程启蒙|Scratch 转 Python 系列第9天:字典/哈希表积木双向对照(AI大模型参数配置表实战)
开发语言·人工智能·python·numpy·pandas
zhz52148 小时前
GIS项目中空间参考转换与MBTiles偏移:问题成因、解法与避坑
python·vue·gis
KaMeidebaby9 小时前
卡梅德生物技术快报|如何制备单克隆抗体:小众禽类靶点单抗制备实操流程:双载体抗原交叉筛选完整工艺记录
人工智能·python·深度学习·算法·机器学习
乱写代码10 小时前
Pydantic学习--BaseModel
python
fu159357456810 小时前
【边缘计算实战】P1:从零搭建边云任务卸载仿真实验台(Python 可复现)
数据库·python·边缘计算
蜡台10 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
智能体与具身智能11 小时前
TVA 本质内涵与核心特征(系列)
人工智能·python·智能体视觉
云雾J视界11 小时前
SST:高频变压器设计实战:铁氧体 vs 纳米晶 vs 非晶,磁性材料怎么选
python·acdc·dab·sst
第一程序员11 小时前
Rust trait 入门:把 AI 客户端抽象成可替换接口
python·rust·github
Ulyanov12 小时前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头