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

相关推荐
弱冠少年19 分钟前
websockets库使用(基于Python)
开发语言·python·numpy
技术无疆42 分钟前
【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
开发语言·人工智能·python·深度学习·神经网络·机器学习·数据挖掘
羊小猪~~1 小时前
机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
人工智能·python·机器学习·数据挖掘·数据分析·回归·时序数据库
qq_273900231 小时前
解析TMalign文本文件中的转换矩阵
python·生物信息学
阿华的代码王国2 小时前
【JavaEE】——文件IO的应用
开发语言·python
电饭叔2 小时前
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
开发语言·python
程序猿小D3 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
杰哥在此4 小时前
Python知识点:如何使用Multiprocessing进行并行任务管理
linux·开发语言·python·面试·编程
zaim16 小时前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
PythonFun10 小时前
Python批量下载PPT模块并实现自动解压
开发语言·python·powerpoint