所谓单链表的迭代器,就是将原本链表中用于处理遍历、访问和更新的方法封装到一个新的迭代器类中,而只在链表类中保留描述其状态的成员函数。在讨论其实现方法和特点之前,先看一下是如何使用的。



















从中不难看出,绝大多数对链表的处理是通过迭代器来完成的(事实上最后的输出整个链表也是如此)。那么为何在main()中,一个迭代器对象能处理一个链表对象呢,看起来它们的“地位”似乎是一样的。请注意上述代码中的第五行:List<int> itr(list); 在定义一个迭代器 itr 时,需要将一个链表对象 list 作为参数传递给迭代器类的构造函数。迭代器类和链表类一样有一个头指针,利用链表结点的特性,在迭代器类的构造函数中,通过把链表的头指针赋给迭代器的头指针,使得它们同时指向链表的头结点,迭代器就能访问整个链表了。
以下是具体实现的代码,参考自《数据结构与算法(C++)》 2005 上海交通大学出版社 窦延平 张同珍 姜丽红 陈玉泉。(这本书我很不推荐)
链表类:
























链表迭代器类:


































单链表结点类:































单链表类:
























































































迭代器类:




































































































































细心的人肯定已经发现了,要使迭代器能够访问链表的头指针,必须将迭代器类设为链表类的友元类,这在一定程度上破坏了类的封装性。使用迭代器的初衷是未避免经常修改链表类以及链表类变的过于庞大。然而面向对象程序设计的一个基本原则是封装性和信息隐蔽。友元类虽然有助于数据共享,却违背了信息隐蔽,一般只有在使用它时能使程序精炼并能大大提高程序的效率时才使用友元。
很显然,在构建链表时使用迭代器使程序变的复杂,不利于初学者把精力放在数据结构本身上。同时以破坏封装性为代价,在小规模程序中并没有提高程序的效率(反而是降低了)。因此我建议初学者在学习数据结构时不要使用迭代器。
可以通过此链接下载本程序:http://cid-24fba8dfcc188fae.skydrive.live.com/self.aspx/Public/ListItr.rar