链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据本身及一个指向列表中下一个节点的引用(或指针)。与数组不同,链表中的元素并不是在内存中连续存储的,这使得在链表中添加或删除节点时无需移动其他元素。
本文打算手把手的教你使用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
指针连接各个节点,而双向链表则通过prev
和next
指针在节点之间建立双向连接,使得从头到尾或从尾到头遍历链表变得更加方便。这两种链表在不同的场景下各有优势,能够有效地解决各种数据管理问题。