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

相关推荐
m0_7482323910 分钟前
基于OpenCV和Python的人脸识别系统_django
python·opencv·django
dme.35 分钟前
Python爬虫selenium验证-中文识别点选+图片验证码案例
爬虫·python
东方-教育技术博主38 分钟前
wps中zotero插件消失,解决每次都需要重新开问题
python
镰圈量化1 小时前
当电脑上有几个python版本Vscode选择特定版本python
开发语言·vscode·python
宇努力学习1 小时前
如何本地部署seepseek
python·ai·ollama·deepseek
橙狮科技1 小时前
使用 GPTQ 进行 4 位 LLM 量化
人工智能·python·语言模型
开开心心就好2 小时前
娱乐使用,可以生成转账、图片、聊天等对话内容
windows·python·智能手机·软件工程·娱乐·软件需求
愚昧之山绝望之谷开悟之坡2 小时前
ragflow-RAPTOR到底是什么?请通俗的解释!
python
背太阳的牧羊人2 小时前
RAG检索中使用一个 长上下文重排序器(Long Context Reorder) 对检索到的文档进行进一步的处理和排序,优化输出顺序
开发语言·人工智能·python·langchain·rag
007_rbq2 小时前
XUnity.AutoTranslator-Gemini——调用Google的Gemini API, 实现Unity游戏中日文文本的自动翻译
人工智能·python·游戏·机器学习·unity·github·机器翻译