使用C++ STL里的list 我刚开始用的是remove();
这个方法现在发现真的是捉襟见肘。
因为每次移除是按值匹配移除,
所以相同的值的所有元素都被移除:
例子,转置一个链表的一段值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | //程序详见: template<class T> void ReverseInPart( T & L ,int n ) {//实现功能的主要部分,反转f到t的f-t个元素 cout << "Enter two number as changed form and to :" ; int f, t ; cin >> f >> t ; if(f >= t || t > n || f < 1) { cout << "Do not need reverse!\n" ; return; } Literator lt= L.begin(); int l = 1 ; while ( l < f) { lt++; l++ ; } Literator ch = lt ;//使用迭代器来完成 ++ch; //迭代器始终指向一个元素的位置,所以lt迭代器每次都前移 //而ch每次指向下一个元素,即第i+1个元素 for(int i = f ; i < t ; ++i,--lt) { int x = *ch ; ++ch; //由于remove会删除所有值为*ch 的元素,所以ch 应该先增加 //使用erase更方便,详见gx/abort_stl_list L.remove(x); L.insert(lt,x); } //remove void remove( const TYPE &val );删除所有值为val的元素 } |
可以看出如果输入链表元素都是不同的值的话都无所谓
比如说 1→2→3→4→5,现在逆转2~5
得到:1→5→4→3→2
但是如果输入中有相同的数就会发生错误,
如原链表:1→2→2→1
(其实是个镜像链表,这个在《程序员面试算法》的第17题有体现)
逆转3~4后,L.remove(x);这里x值为1时,
将导致删除两个元素,最后得到的链表就变成了:
2→1→2
后面发现erase()这个方法,可以直接删除迭代器
指向的链表元素,这个方法是很方便的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | template<class T> void ReverseInPart( T & L ,int n ) {//实现功能的主要部分,反转f到t的f-t个元素 cout << "Enter two number as changed form and to :" ; int f, t ; cin >> f >> t ; if(f >= t || t > n || f < 1) { cout << "Do not need reverse!\n" ; return; } Literator lt= L.begin(); int l = 1 ; while ( l < f) { lt++; l++ ; } Literator ch = lt ;//使用迭代器来完成 ++ch; //迭代器始终指向一个元素的位置,所以lt迭代器每次都前移 //而ch每次指向下一个元素,即第i+1个元素 for(int i = f ; i < t ; ++i,--lt) { int x = *ch ; Literatir d_ch; ++ch; //由于remove会删除所有值为*ch 的元素,所以ch 应该先增加 //使用erase更方便,详见gx/abort_stl_list L.erase(d_ch); L.insert(lt,x); } //remove void remove( const TYPE &val );删除所有值为val的元素 } |
近期评论