使用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指针在节点之间建立双向连接,使得从头到尾或从尾到头遍历链表变得更加方便。这两种链表在不同的场景下各有优势,能够有效地解决各种数据管理问题。

相关推荐
chao_78912 分钟前
二分查找篇——寻找旋转排序数组中的最小值【LeetCode】
python·线性代数·算法·leetcode·矩阵
金玉满堂@bj28 分钟前
PyCharm 中 Python 解释器的添加选项及作用
ide·python·pycharm
程序员三藏33 分钟前
如何使用Pytest进行测试?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
随心点儿1 小时前
使用python 将多个docx文件合并为一个word
开发语言·python·多个word合并为一个
不学无术の码农1 小时前
《Effective Python》第十三章 测试与调试——使用 Mock 测试具有复杂依赖的代码
开发语言·python
sleepybear11131 小时前
在Ubuntu上从零开始编译并运行Home Assistant源码并集成HACS与小米开源的Ha Xiaomi Home
python·智能家居·小米·home assistant·米家·ha xiaomi home
纪伊路上盛名在1 小时前
(鱼书)深度学习入门1:python入门
人工智能·python·深度学习
夏末蝉未鸣012 小时前
python transformers笔记(TrainingArguments类)
python·自然语言处理·transformer
德育处主任Pro2 小时前
「py数据分析」04如何将 Python 爬取的数据保存为 CSV 文件
数据库·python·数据分析
咸鱼鲸2 小时前
【PyTorch】PyTorch中数据准备工作(AI生成)
人工智能·pytorch·python