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使用,只訪問或者增刪頭端或者尾端的數據,這樣速度快。