学习迭代器之前,先看一种数据结构--线性表
线性表:线性表是最基本,最简单,也是最常用的一种数据结构。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用于大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了哨位结点)。
我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所有双链表和循环链表依旧是线性表。
在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受线性表主要包括栈和队列,受限表示对结点的操作受限制。
线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。
如下图为栈和队列结构图:
用代码实现一个链表:
首先创建一个结点类《Node》:
Node.h:
Node.m:
然后创建一个链表类《LinkedList》:
LinkedList.h:
LinkedList.m:
迭代器模式:
迭代器(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
首先看一个系统的迭代器模式,遍历一个集合中的所有元素:
//系统的迭代器
//创建集合对象
NSArray *datas = @[@"A", @"B", @"C", @"D"];
//从集合对象创建迭代器
NSEnumerator *iterator = [datas objectEnumerator];
//从集合对象中访问元素
id arrayObj = nil;
while (arrayObj = [iterator nextObject]) {
NSLog(@"arrayObj:%@", arrayObj);
}
打印结果:A,B,C,D
实现自定义的迭代器:
1,创建结点类和链表类
《Node》,《LinkedList》
Node.h:
Node.m:
LinkedList.h:
LinkedList.m:
2.创建一个迭代器协议类《IteratorProtocol》
3.创建迭代器《LinkedListIterator》:
LinkedListIterator.h:
LinkedListIterator.m:
4.实现: