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

相关推荐
小小毛桃4 分钟前
在PyTorch中,使用不同模型的参数进行模型预热
人工智能·pytorch·python
cliffordl12 分钟前
ReportLab 导出 PDF(图文表格)
python·pdf
杰瑞学AI21 分钟前
LeetCode详解之如何一步步优化到最佳解法:27. 移除元素
数据结构·python·算法·leetcode·面试·职场和发展
前端开发张小七40 分钟前
每日一练:3统计数组中相等且可以被整除的数对
前端·python
程序员总部41 分钟前
Python正则表达式有哪些常用匹配字符?
python·mysql·正则表达式
天天进步20151 小时前
Python项目--基于Python的自然语言处理文本摘要系统
开发语言·python·自然语言处理
小麦果汁吨吨吨1 小时前
Flask快速入门
后端·python·flask
流云一号1 小时前
Python实现贪吃蛇三
开发语言·前端·python
小白教程1 小时前
如何处理Python爬取视频时的反爬机制?
开发语言·python·音视频·python爬虫
热爱编程的OP1 小时前
Numpy常用库方法总结
开发语言·python·numpy