节点变量会初始化为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 = node3
python会抛出一个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。因此,这个过程的最后,节点实际上从链表结构中删除了。对于顺序来说,节点不可再用,并且会在下一次垃圾回收的时候回收。
结束!