《数据结构与算法分析》习题-----第二章(3)(关于list的题目)
PS:这两条习题是添加到STL的List代码实现
http://www.cnblogs.com/alan-forever/archive/2012/09/12/2682437.html
3.15 给List类添加splice操作。
void splice( iterator position, List<Object> & lst )
删除lst中的所有项,并将这些List * this中的位置position之前。lst和*this必须是不同的表,所写的例程必须是常量时间的。
PS:刚开始以为O(n)是常量,最后我发现我严重的错了,之前还想逐个逐个调用inset函数,好吧,我错了。
1 void splice( iterator position, List<Object> & lst ) 2 { 3 Node *p = position.current; 4 5 p->prev->next = lst.head->next; 6 lst.head->next->prev = p->prev; 7 lst.tail->prev->next = p; 8 p->prev = lst.tail->prev; 9 10 theSize += lst.size(); 11 12 lst.init(); 13 }
3.16,给STL List类实现添加逆向迭代器。定义reverse_iterator 和const_reverse_iterator。添加方法rbegin和rend,来分别返回逆向迭代器所指向末尾标记前的项的位置和表头结点的位置,逆向迭代器在内部逆转++和--操作的意义,应该可以使用下面的代码逆向打印链表。
List<int>::reverse_iterator itr1 = l1.rbegin();
while( itr1 != l1.rend() )
cout << *itr1++ <<" ";
cout << endl;
PS:代码里面的注释有点不正确,只是含糊解释。
PS:下图有助于理解迭代器!!!!
下面的代码是逆向迭代器类的定义。
1 class const_reverse_iterator 2 { 3 public: 4 const_reverse_iterator( ) : current( NULL ) { } 5 6 const Object & operator* ( ) const 7 { 8 return retrieve( ); 9 } 10 11 const_reverse_iterator & operator++ ( ) 12 { 13 current = current->prev; 14 return * this; 15 } 16 17 const_reverse_iterator operator++ ( int ) 18 { 19 const_reverse_iterator old = *this; 20 ++( *this ); 21 return old; 22 } 23 24 const_reverse_iterator & operator-- ( ) 25 { 26 current = current->next; 27 return * this; 28 } 29 30 const_reverse_iterator operator-- ( int ) 31 { 32 const_reverse_iterator old = *this; 33 ++( *this ); 34 return old; 35 } 36 37 bool operator== ( const const_reverse_iterator & rhs ) const 38 { 39 return current == rhs.current; 40 } 41 42 bool operator!= ( const const_reverse_iterator & rhs ) const 43 { 44 return !( *this == rhs ); 45 } 46 47 private: 48 Node * current; 49 50 Object & retrieve( ) const 51 { 52 return current->data; 53 } 54 55 const_reverse_iterator( Node * p ) : current( p ) { } 56 57 friend class List<Object>; 58 }; 59 //逆向迭代器 60 61 class reverse_iterator 62 { 63 public: 64 reverse_iterator( ) : current( NULL ) { } 65 66 const Object & operator* ( ) const 67 { 68 return retrieve( ); 69 } 70 71 reverse_iterator & operator++ ( ) 72 { 73 current = current->prev; 74 return * this; 75 } 76 77 reverse_iterator operator++ ( int ) 78 { 79 reverse_iterator old = *this; 80 ++( *this ); 81 return old; 82 } 83 84 const_reverse_iterator & operator-- ( ) 85 { 86 current = current->next; 87 return * this; 88 } 89 90 reverse_iterator operator-- ( int ) 91 { 92 const_reverse_iterator old = *this; 93 --( *this ); 94 return old; 95 } 96 97 bool operator== ( const reverse_iterator & rhs ) const 98 { 99 return current == rhs.current; 100 } 101 102 bool operator!= ( const reverse_iterator & rhs ) const 103 { 104 return !( *this == rhs ); 105 } 106 107 private: 108 Node * current; 109 110 Object & retrieve( ) const 111 { 112 return current->data; 113 } 114 115 reverse_iterator( Node * p ) : current( p ) { } 116 117 friend class List<Object>; 118 };
下面代码是返回特殊位置的迭代器
1 reverse_iterator rbegin( ) 2 { 3 return reverse_iterator( tail->prev ); 4 } 5 const_reverse_iterator rbegin( ) const 6 { 7 return const_reverse_iterator( tail->prev ); 8 } 9 //逆向begin迭代器,返回tail的前一个迭代器。 10 11 reverse_iterator rend( ) 12 { 13 return reverse_iterator( head ); 14 } 15 const_reverse_iterator rend( ) const 16 { 17 return const_reverse_iterator( head ); 18 } 19 //逆向end迭代器,返回head节点的迭代器。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步