节点变量会初始化为None值或者一个新的None对象。
class Node(object): def __init__(self, data, next=None): self.data = data self.next = next # 仅仅是空链接 node1 = None # 一个包含数据和空链接的节点 node2 = Node("A") # 一个包含数据和链接node2的节点 node3 = Node("B", node2)下图表示在运行该节点之后3个变量的状态:
注意如下情况:
node1没有指向节点对象(是None)。node2和node3指向所链接到的对象。node2指向一个对象,其下一个指针为None。现在,假设你试图运行如下的语句,在已经包含了node2和node3的链接结构的开头位置添加一个节点:
node1.next = node3python会抛出一个AttributeError作为响应。作出这一响应的原因是,变量node1包含了值None,因此不会引用包含了一个next字段的对象。
要创建我们想要的链接,如下:
node1 = Node("c", node3)或者,如下:
node1 = Node("c") node1.next = node3通常在尝试访问一个给定的节点变量之前。我们可以通过询问其是否为None。从而保证其不发生意外:
if nodeVariable != None: <access a field in nodeVariable>像数组一样,链表结构也是用循环来处理的。可以使用循环来创建一个链表结构,并且访问其中的每一个节点。
下面是测试脚本使用了Node类来创建一个单链表结构,并且输出其内容:
# coding: utf-8 class Node(object): def __init__(self, data, next=None): self.data = data self.next = next head = None for count in range(1,6): head = Node(count, head) while head != None: print head.data head = head.next关于这个程序,注意以下几点:
指针head生成了链表结构。这个以这样一种方式操作,最近插入的项总是位于结构的开始处。因此,当显示数据的时候,他们按照插入时相反的顺序出现。此外,当显示数据的时候,head指针重新设置为下一个节点直到head指针变为None。因此,这个过程的最后,节点实际上从链表结构中删除了。对于顺序来说,节点不可再用,并且会在下一次垃圾回收的时候回收。