C++ STL 中list是双向循环链表,双向可以理解,有两个指针域,指向前一结点和指向后一结点,双向可以实现从末尾结点到头结点的遍历,但循环实现什么功能?
错误代码:
#include<list> #include<iostream> int main() { list<int> li; for(int i=0;i<5;++i) li.push_back(i); list<int>::iterator it=li.end(); cout<<*(--it);//输出4 cout<<*(++it);//若为循环链表,不是应该回到头结点吗?实际输出错误! //若为循环链表,那end()是指向哪里? return 0; }
链表的内存结构是循环的,每一个来节点(node)结构,node结构包含一个指向之前节点的指针,另外一个指向之后的节点,以及一个数据元素(你这里是int),所以一个node结构自己是不知道自己是list中的第几个(没有储存相应的信息)。
但是,最末一个node,它的后指针是指向链表的终结记号,然后终自结记号的node也有一个指针,才指向list的第一个node。所以,++it指向的是终结记号,上面是没有数据的,当然输出错误。
说双向的意思是:你可以在首端加入新的数据node,也可以在末端加入新的数据node,但不表示你可以无限循环的遍历它。
另外,List模板,不建议你使用iterator(迭代器),因为每一个node都不知道自己是第几个node,如果你使用迭代器指定你要访问第n个node的数据,它总是从首元素开始一个个数到第n,然后才返回数据给你。最好把链表当作动态的栈来zhidao使用,只访问或者增删头端或者尾端的数据,这样速度快。