在c++中,我们以指针的形式直接访问数据的地址,在这些较为现代的预言中,单链表结构中的一个节点,包含了一个数据项和指针值。一个特殊的空值(或nil),表示指针值是一个空链接。我们并不使用数组来构建不连续的内存,而是直接向计算机请求一个指针指向一个新的节点,这个节点来自于名为对象堆的一个内建的不连续内存区域。然后,我们在该节点中设置了指向另一个节点的指针,由此建立了到结构中的其他数据的一个链接。然而,c++中得通过一种特殊的处理或删除操作,来向其返回那些不再使用的节点。
python程序员使用对 对象的引用建立起了节点和链表结构。在Python中,任何变量都可以引用任何内容,包括None值,它意味着一个空的链接。由此。Python程序员通过定义包含两个字段的一个对象,从而定义了一个单链表节点。这两个字段是:数据项的一个引用和到另一个节点的一个引用。Python为每一个新的节点对象提供了动态分配的非连续的内存,并且当对象不再被引用程序引用的时候,会自动把内存返回给系统(垃圾收集)。
定义一个单链表节点类。
如下是一个简单的、单链表节点类的代码,代码放在模块node.py中。
"""
File: node.py
定义一个单链表节点类
"""
class Node(object):
def __init__(self,data,next = None):
self.data = data
self.next = next
创建一个单链表结构,并且访问输出其内容:
"""
File: testnode.py
测试节点类。
"""
from node import Node
head = None
#创建一个单链表结构
for count in range(1,6):
head = Node(count,head)
#输出节点内容,输出完后,单链表结构也销毁了
while head != None:
print(head.data) #输出:5, 4, 3, 2, 1
head = head.next
单链表结构创建好后其结构如下图:
head为头指针,指向第一个节点对象(head为变量,是第一个节点对象的引用),最后一个节点对象的字段值next为None值。
单链表结构上的操作
1. 遍历
遍历操作需要一个临时变量,这个变量先初始化为链表结构的head指针,然后控制一个循环,如下所示:
from node import Node
head = None
#创建一个单链表结构
for count in range(1,6):
head = Node(count,head)
probe = head
#输出节点内容,输出完后,单链表结构依然存在
while probe != None:
print(probe.data) #输出:5, 4, 3, 2, 1
probe = probe.next
通常,遍历一个单链表结构会访问每一个节点,并且当遇到一个空链接的时候终止。因此,值None充当负责停止这个过程的哨兵。
遍历在时间上是线性的,并且不需要额外的内存。
2. 搜索
在这个例子中,会出现两个可能的哨兵:
- 空链接,表明不再有要检查的数据。
- 等于目标项的一个数据项,表明一次成功的搜索。
如下是搜索一个给定项的代码:
from node import Node
head = None
#创建一个单链表结构
for count in range(1,6):
head = Node(count,head)
probe = head
targetItem = 3 #搜索链表结构中是否存在数据项为3的节点
while probe != None and targetItem != probe.data:
probe = probe.next
if probe != None:
print("目标数据项t